在this网站上,指定:
“constexpr功能必须满足以下要求:
[...]
至少存在一组参数值,这样函数的调用可以是核心常量表达式的计算子表达式(对于构造函数,在常量初始化器中使用就足够了) C ++ 14)。违反此子弹无需诊断。“
粗体声明的含义是什么?
答案 0 :(得分:5)
struct X {
std::unique_ptr<int> p;
constexpr X() { }
};
在C ++ 14之前,由于[dcl.constexpr]
,这将是不正确的对于constexpr构造函数,如果不存在参数值,那么在函数调用替换之后,mem-initializers中的每个构造函数调用和完全表达式都将是一个常量表达式(包括转换),程序是不正确的;无需诊断。
哪个命令存在一些参数(在这种情况下,只有空集),可以为X::X
的调用创建一个常量表达式,如
constexpr X x; // must be valid before C++14
由于std::unique_ptr
不是文字类型,它有一个非平凡的析构函数,这是不可能的。然而,缺陷报告提出,由于这种用例,constexpr
构造函数在这种情况下仍然应该是格式良好的
X x; // not constexpr, but initialization should be constant
因此重新措辞
对于既不是默认也不是模板的constexpr函数或constexpr构造函数,如果不存在参数值,则函数或构造函数的调用可以是核心常量表达式的计算子表达式,或者表示构造函数,某个对象的常量初始化程序,程序格式错误,无需诊断。
翻译,这意味着:constexpr
构造函数只要是constexpr
函数就是格式良好的,并且其成员初始化也是constexpr
函数,即使类型本身也是如此永远不会是constexpr
。