声明constexpr函数或方法

11

我想知道constexpr函数和方法的声明是否有任何限制,就像inline函数和方法一样。

我知道inline函数或方法必须写在头文件中,以便编译器可以在调用它们的地方访问它们的定义。如果对于constexpr也有类似的要求,那么这是有意义的,但是我无法找到任何相关信息......

所以我的问题基本上是:

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

  • 我能否分离constexpr函数或方法的声明和定义?


这可能与https://dev59.com/zW445IYBdhLWcg3wq8FY有关。 - alediaferia
7
在C++中,constexpr函数和constexpr构造函数默认为隐式的inline函数。这意味着在每个使用该函数的翻译单元(源文件)中都需要有一个定义,并且可以在不同的源文件中具有多个等效的定义(参见ODR)。 - dyp
相关:https://dev59.com/HmYq5IYBdhLWcg3wjBQM - dyp
我有点困惑,你是在问是否可以在头文件中声明一个非constexpr的函数,然后在定义它时将其声明为constexpr吗? - deek0146
1个回答

5
定义constexpr函数的位置会影响它的使用方式。特别是:
根据C++14[expr.const]p2规定,如果一个条件表达式e的计算遵循抽象机器(1.9)的规则,将计算以下表达式之一,则该表达式是核心常量表达式:
- … - 未定义的constexpr函数或未定义的constexpr构造函数的调用;
因此,如果仅声明而未定义constexpr函数,则无法在常量表达式(模板参数、constexpr变量初始化器、需要静态评估的全局变量初始化器、数组界限表达式等)中使用它。
同样地,根据C++14[dcl.constexpr]p2规定,constexpr函数和constexpr构造函数隐式地成为inline函数(7.1.2)。
这意味着回答了第一个问题:在头文件中定义constexpr函数不会导致重复符号。这也意味着,如果您在头文件中声明constexpr函数,然后在翻译单元中调用它,即使只在运行时也要“每个引用内联函数都必须在其被odr使用的每个翻译单元中定义”(来自C++14[basic.def.odr]p4)。
请注意,常量表达式和一般调用的规则是不同的:一般调用要求定义在翻译单元的某个地方;常量表达式要求在常量表达式之前进行定义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接