我想知道constexpr函数和方法的声明是否有任何限制,就像inline函数和方法一样。
我知道inline函数或方法必须写在头文件中,以便编译器可以在调用它们的地方访问它们的定义。如果对于constexpr也有类似的要求,那么这是有意义的,但是我无法找到任何相关信息......
所以我的问题基本上是:
我能否在头文件中编写constexpr函数的定义,而不会有重复符号的风险?
我能否分离constexpr函数或方法的声明和定义?
constexpr
函数的位置会影响它的使用方式。特别是:e
的计算遵循抽象机器(1.9)的规则,将计算以下表达式之一,则该表达式是核心常量表达式:constexpr
函数或未定义的constexpr
构造函数的调用;constexpr
函数,则无法在常量表达式(模板参数、constexpr
变量初始化器、需要静态评估的全局变量初始化器、数组界限表达式等)中使用它。constexpr
函数和constexpr
构造函数隐式地成为inline
函数(7.1.2)。constexpr
函数不会导致重复符号。这也意味着,如果您在头文件中声明constexpr
函数,然后在翻译单元中调用它,即使只在运行时也要“每个引用内联函数都必须在其被odr使用的每个翻译单元中定义”(来自C++14[basic.def.odr]p4)。
constexpr
函数和constexpr
构造函数默认为隐式的inline
函数。这意味着在每个使用该函数的翻译单元(源文件)中都需要有一个定义,并且可以在不同的源文件中具有多个等效的定义(参见ODR)。 - dyp