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 对象中的可变成员的主要内容,如果未能解决你的问题,请参考以下文章