构造函数的Constexpr条件

在这个网站上,它指定:

“一个constexpr函数必须满足以下要求:

[...]

至少存在一组参数值,使得函数的调用可以是核心常量表达式的评估子表达式( 对于构造函数,在常量初始化器中使用就足够了 )(自C ++ 14以来)。 违反此项规定不需要诊断。“

粗体语句的含义是什么?


查看链接的缺陷报告

struct X {
    std::unique_ptr<int> p;
    constexpr X() { }
};

在C ++ 14之前,这会因[dcl.constexpr]

对于constexpr构造函数,如果没有参数值存在,以致在函数调用替换之后,mem初始化程序中的每个构造函数调用和全表达式都将是一个常量表达式(包括转换),则该程序不合格; 不需要诊断。

其中规定存在一些可以为X::X的调用创建常量表达式的参数(在这种情况下,只有空集),如

constexpr X x;  // must be valid before C++14

由于std::unique_ptr不是一个文字类型,它有一个非平凡的析构函数,这是不可能的。 然而,缺陷报告提出,由于这种用例, constexpr构造函数在这种情况下应该仍然是constexpr构的

X x;  // not constexpr, but initialization should be constant

因此改写

对于既没有默认也没有模板的constexpr函数或constexpr构造函数,如果不存在任何参数值,以便函数或构造函数的调用可以是核心常量表达式的计算子表达式,或者对于构造函数,可以使用常量初始值设定项一些对象 ,程序不合格,不需要诊断。

这意味着:一个constexpr构造函数只要是一个constexpr函数就是constexpr构的,并且它的成员初始化也是constexpr函数,即使这个类型本身永远不会被constexpr

链接地址: http://www.djcxy.com/p/96979.html

上一篇: Constexpr conditions for constructor

下一篇: Getting Docker for mac proxy variables through terminal