构造函数的Constexpr条件

时间:2017-07-23 19:11:26

标签: c++ oop c++14 constexpr

this网站上,指定:

  

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

     

[...]

     

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

粗体声明的含义是什么?

1 个答案:

答案 0 :(得分:5)

查看linked defect report

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