首页 > 解决方案 > constexpr 函数是隐式静态的吗?

问题描述

如果我在我的定义一个函数program.cpp

constexpr bool isThree(const int number)
{
  return number == 3;
}

这与声明它是静态的有什么不同吗?

static constexpr bool isThree(const int number)
{
  return number == 3;
}

似乎这些应该是等价的,因为constexpr这意味着该函数是内联的,因此不在编译单元之间共享。

constexpr全局函数是隐式静态的吗?

标签: c++c++11constexprstatic-functions

解决方案


constexpr函数是隐式的inline

inline是一个链接功能。在不同编译单元中定义的inline函数不是错误;如果它们的定义不同,则您的程序格式错误,不需要诊断,但如果它们具有相同的定义,则除了一个版本之外的所有版本都将被丢弃并使用该版本。

static,在非方法函数上,也是一个链接特征。定义static不在其编译单元之外共享;编译单元不会“宣传”它有isThree.

static在方法函数上与链接无关。在这种情况下,它只是意味着this没有隐式传递给函数。有/没有this它不起作用的方法有差异,但它们大多与它们无关constexpr。请注意,至少在中,仍然可以对constexpr不使用的方法进行常量评估。this某些版本的constexpr隐式地生成方法const没有。

&isThree在一个编译单元和&isThree另一个编译单元中可以(并且通常会)在何时static(除非激进的 ICF,这是另一个问题的问题)发生变化。当inline它们可能没有变化时。

inline函数在编译单元之间共享它们的完整定义通常在所有知道它的编译单元中都可见,因此它使编译器“内联”(与关键字相反)您的代码更容易。 static不是。 constexpr函数是隐式的inline,但不是隐式static的。

请注意,constexpr有时可以在运行时上下文中评估函数。在编译时上下文中评估时,它们的inlinevsstatic或链接状态真的无关紧要。

constexpr也意味着其他东西,但是您想知道两个不同constexpr声明之间的区别,并且这些含义都没有改变。


推荐阅读