声明constexpr函数或方法

Ete*_*nal 9 c++ constexpr c++11

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

我知道必须在头文件中编写内联函数或方法,以使编译器能够访问它们被调用的定义.如果constexpr有类似的东西会有意义,但我无法找到关于这一点的任何东西......

基本上我的问题是:

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

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

Jef*_*kin 5

定义函数的位置constexpr会影响您使用它的方式。尤其:

\n\n

C++14[expr.const]p2:

\n\n
\n

条件表达式e是核心常量表达式e,除非 的计算遵循抽象机 (1.9) 的规则,将计算以下表达式之一:

\n\n
    \n
  • \xe2\x80\xa6
  • \n
  • 调用未定义的constexpr函数或未定义的constexpr构造函数;
  • \n
\n
\n\n

因此,如果函数仅被声明但尚未定义,则不能constexpr在常量表达式(模板参数、constexpr变量初始值设定项、需要静态计算的全局变量初始值设定项、数组绑定表达式,也许其他)中使用该函数。

\n\n

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

\n\n

C++14[dcl.constexpr]p2

\n\n
\n

\xe2\x80\xa6constexpr函数和constexpr构造函数是隐式的inline(7.1.2)。

\n
\n\n

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

\n\n

请注意,常量表达式和一般调用的规则是不同的:一般调用要求定义位于翻译单元中的某个位置:常量表达式要求定义位于常量表达式之前。

\n