C ++ 17标准-删除静态常量

时间:2019-02-18 10:06:24

标签: c++ language-lawyer c++17 const-cast

最近,我决定深入研究C ++标准,并检查某些代码段是否定义正确以及在标准中的哪里可以找到这些定义。由于该标准很难正确设定(特别是如果您不习惯该标准),我想验证我的假设是否正确。

我遇到了以下示例(这显然是个坏主意)。它可以很好地编译(使用g ++ 8.2.1),但是在执行过程中可以使用SEGFAULT:

#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的工作草案)并找到了6.8.10段:

  

在存储中创建一个新对象,该对象是具有静态,线程或自动的const完整对象   存储持续时间在这样的const对象生命周期之前所占用的存储空间中或内部   结束,导致未定义的行为。

我是对的,该段适用于给定的示例吗?如果不是,我还应该去哪里看看?

1 个答案:

答案 0 :(得分:9)

这是未定义的行为,因为尝试在其上使用const之后修改const_cast变量。

n4659的引文,C ++ 17的最终工作草案。 在这种情况下,相关的段落是:

  

8.2.11常量转换[expr.const.cast]
  ...
  6 [注:根据对象的类型,通过{,{1}}抛弃const限定符而进行的指针,左值或指向数据成员的写入操作可能会产生不确定的行为。 —尾注]

与此部分相关的还有const_cast个对象:

  

10.1.7.1简历限定词[dcl.type.cv]
  ...
  4除了可以声明任何声明为可变的类成员之外,任何在其生存期内修改const对象的尝试都将导致未定义的行为。