抛弃康斯特,就是这种定义明确的行为
Casting away const, is this well defined behavior?
可能的重复项:
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。
这似乎是编译器可以假设常量布尔值和值不会改变C++重复吗?所以我很乐意关闭这个。
这不是定义良好的行为,除非您知道原始值是否恒定。它将在您给出的确切示例中工作。但是,如果您传入了 const 变量,则可能会导致内存访问冲突。这是因为编译器将 const 变量放在只读内存页上。
相关文章:
- 康斯特指针C++斯特劳斯特鲁普
- Static_cast 对于康斯特来说,会抛弃预选赛
- 东康斯泰克普/康斯蒂尼特/康斯特瓦尔在C++20 中允许吗?
- 康斯特正确性建议
- 从字符到康斯特* 字符的转换无效,代码有什么问题?
- T*上的部分排序...和康斯特·
- 调用"树:<int>:运算符==(树*&<int><int>,树*&)康斯特"没有匹配函数
- 抛弃康斯特,就是这种定义明确的行为
- 错误:类型为 '.&' 来自类型的临时 '..*康斯特'
- 无法push_back移动(不可复制与康斯特字段)到矢量
- 传递康斯特字符*的值
- mpg123_open()和康斯特
- 康斯特指针浅拷贝
- C++ wifstream:不兼容的字符常量*,wchar_t康斯特*类型
- 康斯特是谎言吗?(因为康斯特可以被抛弃)
- 康斯特·查尔 * 变得腐败
- 康斯特查尔..改变
- 康斯特与 #define(奇怪的行为)
- 这是抛弃康斯特吗?
- 第二个康斯特在"const int const &someval"做什么?