这更像是一个哲学问题,而不是实际的代码片段,但也许C ++大师可以启发我(并且如果已经被问过就道歉)。
我一直在阅读Meyers的“Effective Modern C ++”一书中的第15项,以及这个帖子:implicit constexpr?(加上合理数量的谷歌搜索)。该项目针对表达式使用了constexpr
,即它定义了在给定编译时输入的情况下可以返回编译时间值的函数。
此外,我提到的StackOverflow线程表明,一些编译器完全能够自己计算出哪些函数调用结果在编译时是已知的。
因此问题:与定义何时编译器应该派生并允许静态/编译时值相比,为什么constexpr
被添加到标准中?
我意识到它使各种只编译(例如std::array<T, constexpr>
)定义不太可预测,但另一方面,根据Meyers的书, constexpr是界面的一部分,...,如果你删除它,你可能会导致任意大量的客户端代码停止编译。
因此,不仅有明确的 constexpr 要求人们记住添加它,它还会为界面添加永久语义。
澄清:这个问题不是为什么应该使用constexpr
。我很欣赏能够以编程方式获得编译时值非常有用,并且在很多场合自己使用它。这是一个问题,为什么在编译器可能自己推断出const-time行为的情况下它是强制性的。
澄清没有。 2 :这是一个代码片段,显示编译器不会自动推断出,我在这种情况下使用了g ++。
#include <array>
size_t test()
{
return 42;
}
int main()
{
auto i = test();
std::array<int, i> arrayTst;
arrayTst[1] = 20;
return arrayTst[1];
}
std::array
声明无法编译,因为我没有将test()
定义为constexpr
,这当然是按照标准。如果标准不同,没有什么能阻止gcc独立地确定test()
总是返回一个常量表达式。
这个问题并没有问“标准是什么定义的”,而是“为什么标准就是这样”?
答案 0 :(得分:5)
在constexpr
之前,编译器有时可以计算出编译时常量并使用它。然而,程序员永远不会知道何时会发生这种情况。
之后,如果表达式不是编译时间常量,并且他或她意识到需要修复它,程序员会立即被告知。