【问题标题】:const_cast conversion to lvalue reference doesn't remove constnessconst_cast 转换为左值引用不会删除 constness
【发布时间】:2014-05-25 15:02:09
【问题描述】:

我想了解以下两种情况的区别。

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?

提前致谢。

【问题讨论】:

  • 你用的是什么编译器?
  • 没有未定义行为的错误答案。

标签: c++ casting constants const-cast


【解决方案1】:

在数据上应用const_cast,然后修改它实际上是恒定的具有未定义的行为。原因在于 constant 数据可能被编译器放置在 readonly 内存中。所以尝试修改会导致UB,输出的内容取决于编译器。

也正如@Yakk 指出的那样,编译器实际上可能只使用 常量变量 的值来减少内存使用。在这种情况下,任何涉及常量变量的表达式都会被编辑以将变量替换为实际值,因此内存中没有任何内容。如果您尝试更改内存内容,请为BOOM做好准备。

底线:不要这样做。

【讨论】:

  • 不只是只读:优化!对const数据的访问可以变成实常数,无需读内存
猜你喜欢
  • 1970-01-01
  • 2023-04-01
  • 1970-01-01
  • 2021-05-15
  • 1970-01-01
  • 2020-05-04
  • 1970-01-01
  • 1970-01-01
  • 2011-11-18
相关资源
最近更新 更多