我的理解是这个(无意义的)代码不是有效的 C++14:
class Point {
public:
constexpr double setX(double newX) { return x = newX; }
private:
double x;
};
我试图找出 C++14 标准(仍是正式草案)的哪一部分不允许它。 constexpr 函数的限制在 7.1.5/2 中列出。 (抱歉格式错误。我不知道如何击败 Markdown 使其看起来正确。)
constexpr 函数的定义应满足以下条件
限制条件:
- 它不应是虚拟的(10.3);
- 它的返回类型应为文字类型;
- 它的每个参数类型都应该是文字类型;
- its function-body shall be = delete, = default, or a compound-statement that does not contain
- asm 定义,
- 一个 goto 语句,
- 一个 try 块,或者
- 非文字类型或静态或线程存储持续时间的变量的定义,或者不执行初始化的变量的定义。
没有任何内容禁止对数据成员进行赋值。 5.19/2(第 15 条)中有这样的禁止(再次格式损坏,抱歉):
条件表达式 e 是核心常量表达式,除非
e 的求值,遵循抽象机的规则 (1.9),
将评估以下表达式之一:
[...]
对象的修改(5.17、5.2.6、5.3.2),除非它应用于文字类型的非易失性左值
指的是一个非易失性对象,其生命周期开始于 e 的求值过程中;
但我不明白 5.19 如何适用于 7.1.5。有人可以澄清一下吗?
它是有效的 C++14。只要对象的生命周期包含在常量表达式的计算中,您就可以修改文字类类型的成员。
指某东西的用途Point
在常量表达式中是有争议的(CWG DR 1452 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#1452),但当前的实现是允许的。它将是一个文字类,只不过它不是聚合的(第 3.9.1/10 节),因为它有一个私有字段(第 8.5.1/1 节)。然而,它的构造不会调用其非 constexpr 构造函数,因为它是可简单构造的。无论如何,这个问题通过添加声明来解决constexpr Point() = default;
.
§5.19 限制常量表达式中可以计算的内容。一个限制是只能constexpr
可以输入函数。 §7.1.5 规定了可以标记哪些功能constexpr
,但请注意constexpr
函数可能包含(在条件语句中)无法在常量表达式中计算的内容。
参见提案文件,second http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3652.html and first http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2013/n3597.html drafts.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)