这更像是一个哲学问题,而不是实用的代码片段,但是也许C++专家可以启发我(如果已经有人问过了,也很抱歉)。
我一直在阅读迈尔斯的“有效的现代C++”一书中的第15项,以及这篇文章:implicit constexpr? (加上合理的谷歌搜索量)。该项讨论了表达式的constexpr用法,即它定义了可以返回给定编译时输入的编译时值的函数。此外,我提到的StackOverflow线程显示,一些编译器完全能够自己确定在编译时知道哪些函数调用结果。
因此,问题是:与定义编译器应该何时派生和允许静态/编译时值相比,为什么要将constexpr添加到标准中?
我意识到它使各种只编译的定义(例如std::array<T, constexpr>)更难以预测,但另一方面,正如Meyers的书中所指出的,constexpr是接口的一部分.如果删除它,可能会导致任意数量的客户端代码停止编译。因此,不仅有显式的constexpr要求人们记住添加它,它还为接口添加了永久的语义。
Clarification:这个问题并不是关于为什么要使用constexpr。我认识到,能够编程地派生编译时值是非常有用的,并在许多情况下自己使用了它。这是一个问题,为什么它是强制性的情况下,编译器可以推断自己的推断时间行为。
说明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()总是返回一个不变的表达式。
这个问题并不是问“标准定义了什么”,而是“为什么标准是这样的”?
发布于 2015-03-02 23:20:07
在constexpr之前,编译器有时可以计算出编译时间常数并使用它。然而,程序员不可能知道什么时候会发生这种情况。
之后,如果表达式不是编译时常量,程序员会立即被告知,并且他或她意识到需要修复它。
https://stackoverflow.com/questions/28821224
复制相似问题