我想知道是否有必要声明constexpr函数和方法的限制,就像内联函数和方法一样。
我知道必须在头文件中编写内联函数或方法,以便编译器可以访问它们被调用的定义。如果constexpr有类似的东西是有道理的,但我无法在那一点找到任何东西...
基本上我的问题是:
我是否可以在头文件中编写constexpr函数的定义,而不会冒重复符号的风险?
我可以分开constexpr函数或方法的声明和定义吗?
答案 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>常量表达式。