【问题标题】:const_casting question [duplicate]const_casting 问题 [重复]
【发布时间】:2011-05-29 22:50:21
【问题描述】:

我有以下代码:

int main(){
  const int a = 1;
  const int* b(&a);
  int* c = const_cast<int*>(b);
  *c = 29; 
  cout<<*c<<a<<*b;
  return EXIT_SUCCESS;
}

为什么'a'的值没有变成29?这是否意味着 const_casting b 时 a 的 const 没有被去掉?

【问题讨论】:

  • 另外,为什么编译器会抱怨?我在 gcc 上运行它。
  • 查看此答案:stackoverflow.com/questions/357600/is-const-cast-safe/…。特别注意:“如果原始变量实际上是 const,那么使用 const_cast 将导致未定义的行为”。
  • @Daniel,谢谢你的链接。

标签: c++ const-cast


【解决方案1】:

常量变量还允许编译器进行某些优化,其中之一是编译器可以将值保留在寄存器中而不是重新加载它。这提高了性能,但不适用于发生变化的变量,因为这些变量需要重新读取。一些编译器甚至通过不分配变量来优化常量,而只是简单地替换内联值。如果您将变量 a 更改为 int 而不是 const int 它将起作用,因为它可以在 IBM 的有关 const_cast 运算符的文档中阅读:

如果你抛弃了一个 已明确的对象 声明为 const,并尝试 修改它,结果未定义。

您可以在此处找到有关您遇到的问题以及为什么它不起作用的更多信息:

附带说明一下,如果您发现自己需要使用const_cast,那么您很有可能应该重新考虑您的设计。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-02
    • 1970-01-01
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 2011-08-26
    • 2011-10-13
    • 2021-04-17
    相关资源
    最近更新 更多