我应该将编译器生成的构造函数标记为constexpr吗?

时间:2013-12-28 02:26:23

标签: c++ c++11

执行之间是否有区别:

X() = default;

constexpr X() = default;

默认构造常量表达式中的类工作正常,这两个例子之间有区别吗?我应该使用一个吗?

1 个答案:

答案 0 :(得分:30)

由于隐式构造函数在您的情况下实际上是constexpr ...

  

[C++11: 12.1/6]: [..] 如果用户编写的默认构造函数满足constexpr构造函数(7.1.5)的要求,则隐式定义的默认构造函数是constexpr [..]

     

[C++11: 7.1.5/3]: constexpr函数的定义应满足以下约束条件:

     
      
  • 它不应是虚拟的(10.3);
  •   
  • 其返回类型应为文字类型;
  •   
  • 每个参数类型都应为文字类型;
  •   
  • 其功能正文 = delete = default 或仅包含复合声明   
        
    • null语句,
    •   
    • static_assert-声明
    •   
    • typedef声明和 alias-declarations ,它们没有定义类或枚举,
    •   
    • 使用-声明
    •   
    • using指令
    •   
    • 和一个return语句;
    •   
  •   
  • 初始化返回值(6.6.3,8.5)时使用的每个构造函数调用和隐式转换都应该是常量表达式(5.19)中允许的那些之一。
  •   

......声明实际上是等同的:

  

[C++11: 8.4.2/2]:明确默认的函数只有在被隐式声明为constexpr时才可以声明为constexpr,并且可能有一个明确的异常规范仅当它与异常规范兼容(15.4)时   在隐含声明上。 如果某个功能在其第一个声明中明确默认,

     
      
  • 如果隐式声明为,则隐含地认为是constexpr
  •   
  • 隐含地认为它具有相同的异常规范,就像它已被隐式声明(15.4)和
  • 一样   
  • 对于复制构造函数,移动构造函数,复制赋值运算符或移动赋值运算符,它应具有与隐式声明的相同的参数类型。
  •   

这样做也没关系。

在一般情况下,如果你肯定想要一个构造函数为constexpr,那么保留关键字是明智的,这样如果它不符合标准,你至少会得到编译器错误;如果没有实现它,你可能会得到一个非constexpr构造函数。