在C ++ 14标准(ISO / IEC 14882:2014)中,第5.19节第2款(强调我的)中添加了“ 不可更改 ”一词:
甲条件表达式 e是一个核心常量表达式除非e的评价,如下所述抽象机(1.9),将评估下面的表达式中的一个的规则:
[...]
左值到右值转换(4.1),除非将其应用于
[...]
非易失性glvalue,它引用用constexpr定义的非易失性对象,或引用该对象的不可更改子对象,或者
因此,此代码在C ++ 14中不正确:
class A { public: mutable int x; }; int main(){ constexpr A a = {1}; constexpr int y = a.x; return 0; }
但是,在C ++ 11中是否正确?
这是缺陷报告(CD3)1405,他们提议在其中添加非可变的:
当前,文字类类型可以具有可变成员。尚不清楚这是否会对constexpr对象和常量表达式造成任何特殊的问题,如果是这样,应该如何处理。
所以我会说这是正确的C ++ 11代码。尽管如此,我还是使用-std = c ++ 11尝试了Clang和GCC,并且都输出了一个错误,指出常量表达式中不允许使用可变变量。但是该约束是在C ++ 14中添加的,而在C ++ 11中则没有。
有谁知道该代码在C ++ 11中是否正确?
另请参阅缺陷报告(CD3)1428。