【发布时间】: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