【问题标题】:Mutable Member in a ConstExpr Object in C++11C++11 中的 ConstExpr 对象中的可变成员
【发布时间】:2017-01-25 10:10:58
【问题描述】:

在 C++14 标准 (ISO/IEC 14882:2014) 中,“non-mutable”一词被添加到第 5.19 节第 2 段(强调我的):

条件表达式 e 是一个核心常量表达式,除非按照抽象机 (1.9) 的规则对 e 的求值将求出下列之一表达式:

  • [...]
  • 左值到右值的转换 (4.1),除非它应用于
    • [...]
    • 一个非易失性左值,它引用一个用 constexpr 定义的非易失性对象,或引用该对象的 non-mutable 子对象,或

因此,这段代码在 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,他们建议在其中添加 non-mutable

目前,文字类类型可以具有可变成员。目前尚不清楚这是否会给 constexpr 对象和常量表达式带来任何特殊问题,如果是,应该怎么做。

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

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

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

【问题讨论】:

  • 这是C++11缺陷报告,那么C++11需要修复。符合 C++11 的编译器必须包含该 DR
  • @danh 这既完整又足够长,可以作为答案。请把它移到下面的方框中。谢谢您的合作。 ;)

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


【解决方案1】:

这是C++11缺陷报告,那么C++11需要修复。只有那些与 DR、accepted、DRWP 和 WP 状态相关的问题不是 C++ 国际标准的一部分。

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

例如,这对示例因 DR 1579 而更改:

这个例子取自:Why this C++ program gives different output in C++11 & C++14 compilers

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-15
    相关资源
    最近更新 更多