【问题标题】:C++17: Defining static constexpr member functons in .cpp fileC++17:在 .cpp 文件中定义静态 constexpr 成员函数
【发布时间】:2020-01-30 23:39:15
【问题描述】:

我在 .h 文件中声明了一个静态 constexpr 成员函数。如果我立即在头文件中定义该函数,则一切正常。我一般倾向于在 .cpp 文件中定义函数(即使我希望它们内联,我也会使用 inline 关键字并再次这样做)所以当我尝试这样做时,一开始似乎还可以,但当我尝试时调用这个函数我得到以下错误:

static constexpr uint16_t ClassA::myFoo()' used before its definition

我想了解是否有办法在 .cpp 文件而不是头文件中定义静态 constexpr 成员函数。如果由于我使用的编译器而无法实现或可能受到限制,那么在 .h 文件中定义函数是否有任何副作用? (我知道它对于普通函数是显式内联的,但我不确定对于 constexper 静态函数)。

PS:我在一个小型嵌入式项目中使用 arm-none-eabi-g++ (c++17) 和 Clion。

【问题讨论】:

  • constexpr 旨在用作编译时表达式。在标题中定义很好,也是最合适的地方。至于在cpp中定义它,我可以用我的微软编译器来做,(没有检查在线的)。所以我猜这是你的编译器或其他事情正在发生。

标签: c++ c++17 constexpr


【解决方案1】:

我想了解是否有一种方法可以在 .cpp 文件而不是头文件中定义静态 constexpr 成员函数。

是的...但是您必须在使用它的每个 TU 中定义该函数,因为它是一个内联函数。因此,将定义放入标头中更简单,以便将相同的定义包含在所有需要它的 TU 中。

它是一个内联函数,因为 constexpr 函数是隐式内联函数 - 即无论您是否使用 inline 关键字。

在.h文件中定义函数有副作用吗?

这样做的效果是函数定义将被包含在每个包含标头的 TU 中。在这种情况下,我不太明白您所说的“副作用”是什么意思。

【讨论】:

  • 啊,所以也许操作在另一个 TU 中定义了它,这就是问题所在。不错的收获。
  • @lakeweb 如果您尝试在函数定义之前必须是常量表达式的表达式中使用constexpr 函数(在同一个TU 中),您也会收到类似的错误。正如您在对该问题的评论中提到的那样,函数应该在任何使用之前定义,因为在定义之前,调用函数永远不会被视为常量表达式。
  • 我不知道 constexpr 函数是隐式内联的,但是当我考虑它时,它确实是有道理的。通过副作用,我的意思正是你所说的,所以我没有解释其他奇怪的行为。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-10
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
  • 1970-01-01
相关资源
最近更新 更多