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

Posted

技术标签:

【中文标题】C++11 中的 ConstExpr 对象中的可变成员【英文标题】:Mutable Member in a ConstExpr Object in C++11 【发布时间】: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 这既完整又足够长,可以作为答案。请把它移到下面的方框中。谢谢您的合作。 ;) 【参考方案1】:

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

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

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

gcc 6.1.0 gcc 4.9.3

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

【讨论】:

以上是关于C++11 中的 ConstExpr 对象中的可变成员的主要内容,如果未能解决你的问题,请参考以下文章

字符串文字与整数中的C ++ constexpr vs宏

constexpr 重载

constexpr:编译期与运行期之间的神秘关键字

通过 constexpr 初始化数组

C++11新特性:17—— C++11 constexpr和const的区别

C++11 中的非类型可变参数函数模板