放弃const,这是一种良好定义的行为吗?

3

可能是重复的:
const_cast是否安全?

显然,我永远不会写这段代码,但它是一个非常简单的例子,类似于真实程序中遇到的问题。

#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&,函数不能改变传入的值并相应地生成代码?编辑:我尝试的所有编译器都输出了更改后的值100。这似乎是Can C++ compiler assume a const bool & value will not change?的重复问题,所以我很高兴关闭这个问题。

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

0

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


我理解这一点,并且那不是我的问题。 我的问题是,编译器在生成“main”函数的代码时是否可以假设该函数不能更改值,并生成看不到更新的代码。我认为这是一个不同的问题。 - jcoder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接