在C ++ 14标准(ISO / IEC 14882:2014)中,第5.19节,第2段(强调我的)中增加了“ non-mutable ”这个词:
条件表达式 e是核心常量表达式,除非按照抽象机器(1.9)的规则评估e将评估以下其中一个表达式:
- [...]
- 左值 - 右值转换(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。
答案 0 :(得分:1)
它的C ++ 11缺陷报告,然后需要修复C ++ 11。只有具有DR,接受,DRWP和WP状态的问题不属于C ++国际标准的一部分。
C ++ 11 conformed编译器必须实现该DR。
例如,由于DR 1579,这对示例发生了变化:
此示例取自:Why this C++ program gives different output in C++11 & C++14 compilers