c++ - constexpr 函数是隐式静态的吗?

标签 c++ c++11 constexpr static-functions

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

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

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

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

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

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

最佳答案

constexpr 函数是隐式内联

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

static,在非方法函数上,也是一个链接功能。 static 定义不在其编译单元之外共享;编译单元不会“通告”它具有 isThree 的定义。

方法函数上的

static 与链接无关。在那种情况下,它只是意味着 this 没有隐式传递给函数。有/没有 this it doesn't work 的方法有差异,但它们大多与它们是 constexpr 无关。请注意,至少在 不使用 thisconstexpr 方法仍然可以进行常量计算。 的一些版本使constexpr 方法隐式const没有。

一个编译单元中的

&isThree 和另一个编译单元中的 &isThreestatic 时(除非激进的 ICF,这是一个对于不同的问题很重要)。当 inline 时,它们可能不会改变。

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

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

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

关于c++ - constexpr 函数是隐式静态的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56172170/

相关文章:

c++ - 在 Vector 上 push_back 时设置精度

c++ - 模板类的继承问题

c++ - 如何在 C++ 中进行自动机/状态机编码?

c++ - 很多非类型模板参数

visual-studio - 参数包扩展失败

c++ - 为什么 Visual Studio 不允许我在 enable_if 中使用模板化的 constexpr 函数?

c++ - 什么时候应该在 C++11 中使用 constexpr 功能?

c++ - 无法初始化以 std::byte 作为成员类型的位域

c++ - 启用静态检查以进行持续评估

c++ - 为什么 D 中的并行代码如此糟糕?