声明constexpr函数或方法

时间:2014-06-10 23:24:34

标签: c++ c++11 constexpr

我想知道是否有必要声明constexpr函数和方法的限制,就像内联函数和方法一样。

我知道必须在头文件中编写内联函数或方法,以便编译器可以访问它们被调用的定义。如果constexpr有类似的东西是有道理的,但我无法在那一点找到任何东西...

基本上我的问题是:

  • 我是否可以在头文件中编写constexpr函数的定义,而不会冒重复符号的风险?

  • 我可以分开constexpr函数或方法的声明和定义吗?

1 个答案:

答案 0 :(得分:3)

您定义constexpr功能的位置会影响您使用它的方式。特别是:

C ++ 14 [expr.const] P2:

  

条件表达式e是一个核心常量表达式,除非根据抽象机器(1.9)的规则评估e将评估以下表达式之一:

     
      
  • ...
  •   
  • 调用未定义的constexpr函数或未定义的constexpr构造函数;
  •   

所以你不能在常量表达式中使用constexpr函数(模板参数,constexpr变量初始值设定项,需要静态计算的全局变量初始化程序,数组绑定表达式,或许其他)如果它只被声明但尚未定义。

同样,正如dyp评论的那样,

C ++ 14 [dcl.constexpr] P2

  

... constexpr函数和constexpr构造函数隐式inline(7.1.2)。

这意味着你的第一个问题的答案:在标题中定义constexpr函数不会导致重复的符号。这也意味着如果你在一个标题中声明一个constexpr函数,然后在翻译单元中调用它,即使只是在运行时,“应该在每个使用它的翻译单元中定义一个内联函数。”来自C ++ 14 [basic.def.odr] p4。

请注意,常量表达式和调用的规则通常是不同的:调用通常要求在转换单元中将定义设置为某处:常量表达式要求定义在之前 / em>常量表达式。