C ++ 11中ConstExpr对象中的可变成员

J L*_*J L 5 c++ mutable constexpr c++11 c++14

在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;
}
Run Code Online (Sandbox Code Playgroud)

但是,在C ++ 11中是否正确?

这是缺陷报告(CD3)1405,他们提议在其中添加非可变的

当前,文字类类型可以具有可变成员。尚不清楚这是否会对constexpr对象和常量表达式造成任何特殊的问题,如果是这样,应该如何处理。

所以我会说这是正确的C ++ 11代码。尽管如此,我还是使用-std = c ++ 11尝试了Clang和GCC,并且都输出了一个错误,指出常量表达式中不允许使用可变变量。但是该约束是在C ++ 14中添加的,而在C ++ 11中则没有。

有谁知道该代码在C ++ 11中是否正确?

另请参阅缺陷报告(CD3)1428

Dan*_*anh 2

这是C++11缺陷报告,那么C++11需要修复。只有 DR、已接受、DRWP 和 WP 状态的问题不属于 C++ 国际标准的一部分。

符合 C++11 的编译器必须实现该 DR。

例如,这对例子因为DR 1579而改变:

此示例摘自:Why this C++ program Gives different output in C++11 & C++14 compilers