C++ C++;11
在C++14标准(ISO/IEC 14882:2014)中,在第5.19节第2段(重点)中添加了“不可变的”: 条件表达式e是一个核心常量表达式,除非根据抽象机器(1.9)的规则对e进行求值,将对以下表达式之一求值:C++ C++;11,c++,c++11,c++14,constexpr,mutable,C++,C++11,C++14,Constexpr,Mutable,在C++14标准(ISO/IEC 14882:2014)中,在第5.19节第2段(重点)中添加了“不可变的”: 条件表达式e是一个核心常量表达式,除非根据抽象机器(1.9)的规则对e进行求值,将对以下表达式之一求值: [……] 左值到右值的转换(4.1),除非应用于 [……] 非易失性glvalue,指用constexpr定义的非易失性对象,或指此类对象的非可变子对象,或 因此,此代码在C++14中不正确: class A { public: mutable in
- [……]
- 左值到右值的转换(4.1),除非应用于
- [……]
- 非易失性glvalue,指用constexpr定义的非易失性对象,或指此类对象的非可变子对象,或
class A {
public:
mutable int x;
};
int main(){
constexpr A a = {1};
constexpr int y = a.x;
return 0;
}
但是,它在C++11中正确吗
这是缺陷报告(CD3),他们建议在其中添加不可变的:
目前,文本类类型可以有可变成员。尚不清楚这是否会给constexpr对象和常量表达式带来任何特殊问题,如果是,应该怎么做
所以我认为这是正确的C++11代码。尽管如此,我尝试了使用-std=c++11的Clang和GCC,它们都输出了一个错误,表示常量表达式中不允许使用可变变量。但该约束是在C++14中添加的,而不是在C++11中
有人知道C++11中的代码是否正确吗
另请参见缺陷报告(CD3)。这是C++11缺陷报告,然后需要修复C++11。只有DR、接受、DRWP和WP状态的这些问题不是C++国际标准的一部分。 符合C++11标准的编译器必须实现该DR 例如,由于DR 1579,这对示例发生了更改:
此示例取自:这是C++11缺陷报告,然后需要修复C++11。符合C++11标准的编译器必须包含DR@danh这是一个完整且足够长的答案。请把它移到下面的盒子里。谢谢你的合作