【问题标题】:Declaring constexpr functions or methods声明 constexpr 函数或方法
【发布时间】:2014-06-10 23:24:33
【问题描述】:

我想知道对于必须声明 constexpr 函数和方法的位置是否有任何限制,例如内联函数和方法。

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

所以基本上我的问题是:

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

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

【问题讨论】:

  • [dcl.constexpr]/2 "constexpr 函数和 constexpr 构造函数隐含为 inline" 这意味着您需要在每个翻译单元中定义(源文件)使用该函数的位置,并且您可以在不同的源文件中拥有多个定义,前提是它们是等效的(请参阅 ODR)。
  • 我一头雾水,你是在问能不能在header中声明一个函数不是constexpr,然后在定义的时候,声明为constexpr?

标签: c++ c++11 constexpr


【解决方案1】:

您定义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 函数,然后在翻译单元中调用它,即使仅在运行时,“应在使用 odr 的每个翻译单元中定义内联函数。”来自 C++14[basic.def.odr]p4.

请注意,常量表达式和一般调用的规则是不同的:一般调用要求定义在翻译单元中的somewhere:常量表达式要求定义在before 常量表达式。

【讨论】:

    猜你喜欢
    • 2017-10-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2022-09-23
    • 2018-01-12
    • 2023-04-08
    相关资源
    最近更新 更多