【发布时间】:2019-07-11 16:29:21
【问题描述】:
最近我决定深入研究 C++ 标准并检查某些代码 sn-ps 是否定义良好以及在标准中的何处可以找到这些定义。由于标准很难正确(尤其是如果您不习惯),我想验证我的假设是否正确。
我遇到了以下示例(这显然是个坏主意)。它编译得很好(使用 g++ 8.2.1),但在执行期间 SEGFAULTs:
#include <iostream>
static const int staticInt = 23;
int main () {
int &localInt = const_cast<int &>(staticInt);
localInt = 11;
std::cout << staticInt << std::endl;
return 0;
}
所以,我搜索了标准(我使用 open-std btw 上的工作草案)并找到了第 6.8.10 段:
在存储中创建一个新对象,该对象具有静态、线程或自动的 const 完整对象 存储持续时间占用,或在此类 const 对象在其生命周期之前曾经占用的存储空间内 结束,导致未定义的行为。
我是对的,这一段适用于给定的例子吗?如果不是,我还应该去哪里看?
【问题讨论】:
-
你的代码没有在
staticInt的存储中创建一个新对象,所以它不可能应用。 -
与此问题相关的部分是关于
const变量的部分。您尝试修改const变量,这会导致 UB。故事结局。它是static或在全局范围内,或者您使用对变量的引用或引用在不同的范围内是无关紧要的。 -
@molbdnilo 普通类型的赋值在某些情况下确实会创建一个新对象。不知道这些情况应该是什么......
标签: c++ language-lawyer c++17 const-cast