问题标签 [const-cast]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
194 浏览

c++ - 关于 const_cast<> 的行为

我写了一个小问题来检查 const 数据成员上 const_cast 的行为。

运行此程序后,我将输出作为“yogendra”(一个 8 个字母的字符串)。我得到的输出是“yogendya”现在我的怀疑。通过 const_cast<> 我们可以覆盖数据成员本身的行为,因为这里的字符串是 const char* 在转换之后我仍然可以修改它。

0 投票
1 回答
85 浏览

c++ - 使用 const_cast<> 时出现意外输出

我在下面编写了我的机器(devcpp)和codepad.org的代码,但我的匹配工作正常,并且在codepad.org(http://codepad.org/XfW5a8en)上输出是一个垃圾字符。

我期待输出为 Hello World!

0 投票
2 回答
131 浏览

c++ - 为什么我能够通过类而不是纯代码来修改 const 变量。C++

当我编写此代码片段时,在通过指针修改 const 变量 i 的值后,我将 i 的值设为 10,但是当我打印 *ptr 时,我得到 110。

我得到输出 i: 10 和 *ptr :110。

在这种情况下,我有一个 const 变量 x 作为 Base 类的成员变量。通过函数 show() 我可以修改 const 变量 x 的值,即当我打印 x 和 *ptr 时,我在两者中都得到了改变的值。

任何人都可以帮忙。

0 投票
1 回答
236 浏览

c++ - C++ 11:使用 unordered_set::push 将 const int* 转换为 int*

我有这个使用 c++11 标准的代码转换的问题:

有谁知道这是为什么?我可以解决删除“push”参数中的“const”修饰符的问题。但我不想要它,因为参数“b”没有被修改。

编辑:我对代码的简化产生了一个未引用的地址。我已经制作了一个 struct B 删除它。

0 投票
1 回答
73 浏览

c++ - 更改数据时的 UB 说明

我试图向工作伙伴证明,如果真的想(并且知道如何)通过使用一些技巧来更改常量限定变量的值,在我的演示过程中,我发现存在两种“口味”常量值:无论做什么都无法更改的值,以及可以通过使用肮脏技巧来更改的值。

当编译器使用文字值而不是存储在堆栈中的值在此处读取)时,常量值是不可更改的,这是一段代码,说明了我的意思:

这会产生以下输出:

由于我依赖于UB(更改 const 数据的值),因此预计该程序的行为会很奇怪;但这种怪异超出了我的预期。

假设编译器使用的是字面量值,那么,当代码到达改变常量值的指令(通过引用、指针或memcpying)时,只要该值是字面量(未定义行为虽然)。这解释了为什么该值保持不变,但是:

  • 为什么两个变量中的内存地址相同但包含的值不同?

AFAIK 相同的内存地址不能指向不同的值,因此,输出之一是谎言:

  • 到底发生了什么?哪个内存地址是假的(如果有的话)?

对上面的代码进行一些更改,我们可以尽量避免使用字面值,所以这个诡计可以发挥作用(source here):

产生以下输出:

正如我们所见,const 限定的变量在每次change_with_*调用时都发生了变化,除了这个事实之外,行为与以前相同,所以我很想假设内存地址的奇怪行为在使用 const 数据时会表现出来作为文字而不是价值。

因此,为了确保这个假设,我进行了最后一次测试,将unsigned int valuein更改mainconst unsigned int value

令人惊讶的是,输出与TEST 2此处的代码)相同,所以我认为数据作为变量而不是文字值传递,因为它用作参数,所以这让我想知道:

  • 是什么让编译器决定将 const 值优化为文字值?

简而言之,我的问题是:

  • TEST 1.
    • 为什么 const 值和 no-const 值共享相同的内存地址,但包含的值不同?
    • 程序遵循什么步骤来产生这个输出?哪个内存地址是假的(如果有的话)?
  • TEST 3
    • 是什么让编译器决定将 const 值优化为文字值?
0 投票
1 回答
2470 浏览

c++ - 在 C++ 中返回引用的重载 const 和非 const 类方法

我在 C++ 中有一个数据结构类,它带有对某个对象(可能很大)的访问器,并且我有使用这个访问器的 const 和非常量方法,所以我需要重载它。我正在寻找对下面代码的批评- 也许有一种方法可以完成更清洁的相同事情?

按照我的理解,在以下情况下,有两种方法可以在不复制访问器中的代码的情况下实现此目的,即方法 get()。我不确定这两种方法中的任何一种是否存在严重问题,我想在这里获得一些指导。

我喜欢方法A,因为:

  • 只有一个 const_cast
  • get() 方法的 const 版本返回一个副本
  • 非常量方法直接获取非常量引用

我不喜欢方法A,因为:

  • 非 const 方法 get() 仅通过合同为 const,(未经编译器检查)
  • 很难获得 const 引用,尽管并非不可能

我喜欢方法 B,因为:

  • const 方法 get() 的 const-ness 由编译器检查
  • 返回对象的副本由用户控制

我不喜欢方法 B,因为:

  • 需要两个难以阅读的 const_cast

这是这两种情况的(最小)示例代码。

0 投票
1 回答
1188 浏览

c++ - static const 到 C++ 中共享库中的对象。它在进程之间共享吗?

我一直在用 C++ 编写一个共享库,但我想通过库的用户共享一个类的一些实例。我的意思是,只读对象只从库中​​加载一次,并被链接到库的每个进程使用。

据我所知,这可以使用constor进行static const,但它不能按预期工作。

例如:

使用 GCC 4.8.1 代码编译得很好,但很明显,它在运行时失败,因为x变量是只读的(它在我的 Linux 上产生分段错误)。

但是,让我们看看这段代码:

最后的代码编译并运行良好。可执行打印

我能够修改 const 数据!所以我猜 const 修饰符不适用于类。

然后我的问题是:

  1. const static修饰符对类的实例有什么作用?
  2. 如何将实例放入共享库中以通过不同的进程共享它,加载一次并共享相同的 RAM 内存?

我要实例化的类继承自一个抽象类。我正在使用 C++11,但之前显示的代码在没有 C++11 支持的情况下进行了测试。

对不起,如果我犯了任何英语错误

0 投票
2 回答
2277 浏览

c++ - C++ const_cast 不会删除变量的 const-ness

我尝试执行以下程序。

输出是:

据我所知, const_cast 是一个可变的,所以它可以被改变。当我显示 *ptr 时会反映更改,但更改不会反映. 谁能解释一下?

编辑:感谢所有的答案。我知道我正在观察未定义的行为。而且,我最初对mutable和 *const_cast* 感到困惑。但是,你能告诉我所有的场景,我们都使用 const_cast 吗?

0 投票
2 回答
1041 浏览

c++ - C++。如何将 const_cast 指针指向成员函数?

我想你已经猜到我在写什么了。是的,我应该用 Func const func 实现 mem_fun_ptr_t<>;属性。这将是正确的解决方案。但我正在学习,我想知道一切。那么如何对成员函数指针进行const_cast呢?我试过了f x = const_cast<f*>(Func),但我得到了错误。

感谢您的反馈

0 投票
1 回答
155 浏览

c++ - BOOST_FOREACH 和 cxxtest 插件的铸造问题

我目前正在做一个我使用的项目:

我遇到了一个关于const_cast. 我搜索了高低,并没有找到可以帮助我的在线资源。当我BOOST_FOREACH在测试方法中调用时出现问题。我不断收到以下错误:

const_cast_helper

我开始剖析问题,发现 const_cast 运算符被重载以进行一些运行时检查,我不知道是什么。总而言之,有一个Dereferee::const_cast_helper是 cxxtest 依赖项的一部分,是 const_cast 运算符的重载。

此助手取消定义 const_cast 运算符 (!)

最后重新引入 const_cast 运算符:

#define const_cast ::Dereferee::const_cast_helper

这样每次调用 const_cast 时,都会调用这个助手的适当构造函数。构造函数接受指针、引用、const 指针和 const 引用。

来源在这里:https ://github.com/web-cat/dereferee-with-cxxtest/blob/master/Dereferee/include/dereferee/const_cast.h

rvalue_probe

Boost 还使用强制转换来查看被迭代的集合是左值还是右值,以避免复制它/重新计算表达式。

编译器抱怨以下内容:

在我的情况下, T 是 boost::unordered_map 并且不知何故这个演员表和助手的重载打破了......

有办法解决吗?

我研究了可能的解决方案,但我不知道如何实际实现它们,我没有那么多 C++ 经验。如果我的测试中有这些编译时检查,我一点也不在乎,我可以解决这个问题。因此,任何三个方向的任何帮助都将是最有帮助的!

  1. 禁用 boost 的右值检查,使用 BOOST_WORKAROUND 和 foreach.hpp 中定义的文字

    BOOST_FOREACH_COMPILE_TIME_CONST_RVALUE_DETECTION BOOST_FOREACH_NO_RVALUE_DETECTION BOOST_FOREACH_NO_CONST_RVALUE_DETECTION BOOST_FOREACH_RUN_TIME_CONST_RVALUE_DETECTION

  2. 禁用此const_cast_helper. 当我运行我的测试程序(与测试项目不同的项目)时,我的代码按预期编译和运行,const_cast 的重载会产生问题。

  3. 实施可以修复此错误的扩展。我不知道它是否应该在const_cast_helper或中完成,rvalue_probe但它没有任何好处。

template <typename T> const_cast_helper(rvalue_probe<U>* value_to_cast) : cast_value(const_cast<U*>(value_to_cast)) { }

感谢您提前输入!