const_cast转换为左值引用不会消除恒常性
const_cast conversion to lvalue reference doesn't remove constness
我想了解一下下面两种情况的区别。
const uint32_t v0 = 0;
const uint32_t v1 = 1;
const_cast<uint32_t&>(v0) = v1;
std::cout << v0 << std::endl;
这个结果:然而,0
struct S {
const uint32_t v0;
S() : v0( 0U ) {}
} s;
const_cast<uint32_t&>(s.v0) = v1;
std::cout << s.v0 << std::endl;
我:
1
关于第一种情况,为什么"v0"保持为0?
在数据上应用const_cast
然后修改它,它实际上是常数具有未定义行为。原因在于,编译器可以将常量数据放在只读内存中。因此,尝试修改它将导致UB,将给出的输出取决于编译器。
也正如@Yakk所指出的,编译器实际上可能只使用常量变量的值来减少内存使用。在这种情况下,任何涉及常量变量的表达式都会被编辑为用实际值替换变量,因此内存中没有任何内容。如果您尝试更改内存内容,请准备好BOOM。
底线:不要这样做。
相关文章:
- const_cast静态数组以添加恒常性
- 自动模板参数、数据成员和恒常性
- 有没有办法检测自身内部的类恒常性?
- 为什么const_cast删除指针的恒常性,而不删除指向常量的指针的恒常性?
- 对指针和恒常性兼容性的引用
- 自定义容器中的括号运算符中的恒常性
- C++ 重载分辨率和恒常性
- C++17类模板演绎常性
- C++ 函数匹配和恒常性
- 如何忽略函数模板中的恒常性?
- 常量自动和对象恒常性
- 比较运算符 == 中的共享指针恒常性
- 添加额外的恒常性会导致编译器错误
- 删除模板化函数中的恒常性
- 无法正确理解我的恒常性
- 模板转换运算符优先级和恒常性
- const_iterator和恒常性const_iterator::value_type
- 使用const_cast来添加恒常性 - 坏主意?
- C++ 逻辑恒常性和 const方法的按值返回
- const_cast转换为左值引用不会消除恒常性