【发布时间】:2021-12-19 21:56:24
【问题描述】:
据我所知,c++ 中的 inline 关键字可以追溯到旧的编译器(当时称为“优化编译器”)不能像现代编译器那样优化,因此将函数标记为 @ 987654322@ 告诉编译器这应该被内联,并且作为副作用防止了 ODR 问题。随着编译器变得更好,有人意识到编译器可以比程序员做得更好,因此编译器的inline 要求更像是大多数(全部?)现代编译器忽略的“提示”。
进入 C++11 及后续版本。 constexpr 在我看来似乎处于类似的情况,至少对于它的某些用途,特别是函数和变量。据我了解,它告诉编译器某个函数可能在编译时被评估。但这是编译器应该能够自行解决的问题。一旦编译器在优化方面做得更好,此功能是否也会成为“提示”?
注意:我不是在询问constexpr 的其他用途,例如if 语句。我知道这些是必需的。
【问题讨论】:
-
虽然
constexpr包含一些与inline重叠的上下文,但constexpr远不止这些,与优化无关。 -
@SamVarshavchik 但是你是否认为编译器不能在编译时评估所有可能的东西——即使是没有明确标记为 constexpr 的东西,从而使标记东西 constexpr 只是一个提示?或者编译器没有办法知道是否应该将某些东西标记为 constexpr 吗?我想我要问的是:即使没有明确标记,让一切成为可能 constexpr 是否有缺点。
-
不可能“让一切皆有可能 constexpr”,因为并非一切都符合成为 constexpr 表达式的技术要求。
-
不是提示,而是请求。它告诉某个函数必须在编译时进行评估。如果编译器无法弄清楚如何去做(函数不符合条件的数量),则会引发错误。
-
@SamVarshavchik 这就是我所说的“一切可能”的意思,我想我可以改写为“一切都满足 constexpr 要求” 问题是一样的:为什么编译器不只是在编译时评估对所有可能的时间都进行计时,而不必通过标记 constexpr 来告诉它?
标签: c++