【问题标题】:Casting away const, is this well defined behavior? [duplicate]抛弃 const,这是明确定义的行为吗? [复制]
【发布时间】:2012-09-28 03:37:09
【问题描述】:

可能重复:
Is const_cast safe?

显然我永远不会编写这段代码,但它是一个非常简单的例子,可以在实际程序中出现。

#include <iostream>

void change(const int& data)
{
    int& data2 = const_cast<int&>(data);
    data2 = 100;
}

int main()
{
    int thing = 123;
    change(thing);

    std::cout << thing << "\n";
}

这是明确定义的行为,它改变了引用的数据,还是允许编译器假设因为它传递了一个const int&amp;,所以函数不能改变传入的值并相应地生成代码?

编辑:我尝试过的所有编译器都输出了更改后的值,100。

这似乎与 Can C++ compiler assume a const bool & value will not change? 重复,所以我很乐意关闭它。

【问题讨论】:

  • 那个问题是关于从数据中删除 const 的,这些数据最初是 const ,但这里不是这种情况。除非我错过了这个问题的一些细节,这是可能的:)
  • 阅读该问题的第一个答案,以及对该答案的最后评论。它直接适用于这个问题。
  • 我不确定它是否适用。我的问题是编译器在为“main”生成代码时是否可以假设当它调用“change”时,参数的值不能改变,因为它是 const。我认为这是一个稍微不同的问题。
  • 您的问题标题和描述似乎与您刚才所说的略有不同。您可以考虑打开一个新问题,询问您真正感兴趣的内容。“这是明确定义的行为” - 答案是肯定的,正如链接问题所给出的那样。如果您的问题是编译器是否会尝试避免重新读取本地的 thing,请提出该问题。
  • 实际上有人链接了stackoverflow.com/questions/5128639/…,这似乎确实回答了这个问题,尽管他们似乎已经删除了评论。在这种情况下,我很高兴将其作为重复问题删除。

标签: c++


【解决方案1】:

除非您知道原始值是否为常数,否则这不是明确定义的行为。它将在您给出的确切示例中起作用。但是,如果您传入一个 const 变量,它可能会导致内存访问冲突。这是因为编译器将 const 变量放在只读内存页上。

【讨论】:

  • 我明白这一点,这不是我的问题。我的问题是,编译器是否允许在为“main”生成代码时假设函数无法更改值,并生成看不到更新的代码。我认为这是一个不同的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 2011-08-26
  • 2018-05-03
  • 2022-01-24
相关资源
最近更新 更多