这更像是一个哲学问题,而不是实际的代码片段,但也许C++大师们可以启发我(如果已经问过了,请原谅)。我一直在阅读Meyers的《Effective Modern C++》书中的第15项,以及这个线程:implicit constexpr?(再加上相当数量的谷歌搜索)。该项介绍了使用
因此,问题是:与定义编译器何时推导和允许静态/编译时值相比,为什么要将
constexpr
来表示表达式,即它定义了函数,可以在编译时输入给定的值并返回编译时值。此外,我提到的StackOverflow线程显示,一些编译器完全能够自行确定哪些函数调用结果在编译时已知。因此,问题是:与定义编译器何时推导和允许静态/编译时值相比,为什么要将
constexpr
添加到标准中?我意识到这使得各种仅编译(例如std::array<T,constexpr>
)的定义不那么可预测,但另一方面,正如Meyers的书所述,constexpr是接口的一部分,如果您删除它,可能会导致任意数量的客户端代码停止编译。因此,显式constexpr不仅要求人们记住添加它,而且还为接口添加了永久的语义。
澄清:这个问题不是关于为什么应该使用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()
总是返回常量表达式。
这个问题并不是在问“标准定义了什么”,而是在问“为什么标准是这样的”?
constexpr
实际上不是原始提案的一部分。它出现在该文件的第二版中;我仍在努力弄清楚其基本原理。 - dyp