这是this one.的后续问题
从链接问题中的一个答案中可以看出,将变量声明为constexpr
的目的并不是真正告知编译器将该变量用作常量表达式的可能性(尽管这是编译器的最终行为) )而是向其他程序员传达变量可用于常量表达式的意图。我的问题是,如果变量不打算用在常量表达式中,则将变量声明为constexpr
是否有任何好处,性能或其他方面(例如,类的常量成员变量仅出现在非常量表达式中其他非const成员变量)。还假设这不适用于嵌入式系统。
我使用代码,其中以前的开发人员似乎使用constexpr
喜欢它的糖果,即使它不清楚意图是在常量表达式中使用变量(如前一段中的示例)。我想知道他们是否知道我不知道的事情。
而是向其他程序员传达变量可用于常量表达式的意图。
这是一个意见问题但我不同意。
原则上,我认为最好在编译时将所有可以知道和计算的东西都变成constexpr
。它也可以用于常量表达式这一事实是一个附带的好处。使用constexpr
也可能具有与性能相关的好处。
我想要做的关键点是“在编译时知道值”是变量/数据的一个特征。最好通过使用语言提供的功能捕获该特征。如果有任何不良副作用,那么唯一可以证明不使用它的理由。
是的,constexpr
变量不仅仅用于传达意图和在其他常量表达式中使用。
如果您标记变量constexpr
,编译器将强制它本身使用常量表达式初始化。您可以使用它来确保您希望在编译时评估的内容实际上是。例如:
constexpr int constexpr_function() { return 123; }
int expensive_runtime_function() { return 123; }
void f()
{
constexpr int good1 = constexpr_function(); // OK.
// constexpr int good2 = expensive_runtime_function(); // Good: error.
const int bad1 = constexpr_function(); // OK.
const int bad2 = expensive_runtime_function(); // Bad: unexpected runtime cost.
}