C ++ 11中

时间:2017-01-25 10:10:58

标签: c++ c++11 c++14 constexpr mutable

在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

1 个答案:

答案 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