构造函数的Constexpr条件

use*_*768 8 c++ oop constexpr c++14

网站上,指定:

"constexpr功能必须满足以下要求:

[...]

存在至少一组参数值,使得函数的调用可以是核心常量表达式的计算子表达式(对于构造函数,在常量初始化器中使用就足够了)(自C++ 14起).违反此子弹无需诊断."

粗体陈述的含义是什么?

Pas*_* By 5

查看链接的缺陷报告

struct X {
    std::unique_ptr<int> p;
    constexpr X() { }
};
Run Code Online (Sandbox Code Playgroud)

在C ++ 14之前,由于[dcl.constexpr],这可能会格式错误

对于constexpr构造函数,如果不存在任何参数值,以致于在函数调用替换之后,mem初始化程序中的每个构造函数调用和完整表达式将是一个常量表达式(包括转换),则程序格式错误;无需诊断。

它强制存在一个参数(在这种情况下,只有空集)可以为调用创建常量表达式X::X,如

constexpr X x;  // must be valid before C++14
Run Code Online (Sandbox Code Playgroud)

由于std::unique_ptr不是文字类型,因此具有非平凡的析构函数,因此这是不可能的。但是缺陷报告提出,constexpr由于这种使用情况,构造方法在这种情况下仍应保持格式正确

X x;  // not constexpr, but initialization should be constant
Run Code Online (Sandbox Code Playgroud)

因此改写

对于既没有默认值也没有模板的constexpr函数或constexpr构造函数,如果不存在任何参数值,使得对该函数或构造函数的调用可以是核心常量表达式的求值子表达式,或者对于构造函数而言,该常量初始化器用于某些对象,程序格式错误,无需诊断。

翻译的意思是:constexpr只要构造constexpr函数是一个函数,它的格式就正确,并且其成员初始化也是constexpr函数,即使类型本身永远不能为constexpr