constexpr函数是隐式静态的吗?

Tom*_*ica 6 c++ static-functions constexpr c++11

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

constexpr bool isThree(const int number)
{
  return number == 3;
}
Run Code Online (Sandbox Code Playgroud)

与声明为静态有什么不同吗?

static constexpr bool isThree(const int number)
{
  return number == 3;
}
Run Code Online (Sandbox Code Playgroud)

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

constexpr全局函数隐含静态的?

Yak*_*ont 9

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有时可以在运行时上下文中评估函数。在编译时上下文中进行评估时,它们的inlinevs static或链接状态确实无关紧要。

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