c++ - constexpr 函数是隐式静态的吗?
问题描述
如果我在我的定义一个函数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
是一个链接功能。在不同编译单元中定义的inline
函数不是错误;如果它们的定义不同,则您的程序格式错误,不需要诊断,但如果它们具有相同的定义,则除了一个版本之外的所有版本都将被丢弃并使用该版本。
static
,在非方法函数上,也是一个链接特征。定义static
不在其编译单元之外共享;编译单元不会“宣传”它有isThree
.
static
在方法函数上与链接无关。在这种情况下,它只是意味着this
没有隐式传递给函数。有/没有this
它不起作用的方法有差异,但它们大多与它们无关constexpr
。请注意,至少在c++14中,仍然可以对constexpr
不使用的方法进行常量评估。this
某些版本的c++constexpr
隐式地生成方法const
;c++17没有。
&isThree
在一个编译单元和&isThree
另一个编译单元中可以(并且通常会)在何时static
(除非激进的 ICF,这是另一个问题的问题)发生变化。当inline
它们可能没有变化时。
inline
函数在编译单元之间共享。它们的完整定义通常在所有知道它的编译单元中都可见,因此它使编译器“内联”(与关键字相反)您的代码更容易。 static
不是。 constexpr
函数是隐式的inline
,但不是隐式static
的。
请注意,constexpr
有时可以在运行时上下文中评估函数。在编译时上下文中评估时,它们的inline
vsstatic
或链接状态真的无关紧要。
constexpr
也意味着其他东西,但是您想知道两个不同constexpr
声明之间的区别,并且这些含义都没有改变。
推荐阅读
- mips - 在不使用 syscall 10 的情况下终止 mips 程序(最后需要在 $v0 中存储其他内容)
- prometheus - 如何将标签值提取到 Grafana 中的变量?
- java - 如何在 Nodejs 上解密 Java AES
- erlang - Erlang Cowboy,牛仔缓存页面吗?
- ruby-on-rails - 将 vscode 中的调试配置为 Ruby on Rails 和 Docker
- python - 无法导入 deepfoo 模块?
- haskell - 在 Haskell 中绘制游戏板 - 问题
- python-3.x - Python 正则表达式:处理不匹配的更好方法?
- javascript - 在 ReactJS 中获取 api 数据时登录失败?
- python - defaultdict 更改顺序中的元素