constexpr的目的

Rom*_*anK 5 c++ constexpr c++11

这更像是一个哲学问题,而不是实际的代码片段,但也许C++专家可以启发我(并且如果已经被问过就道歉).

我一直在阅读Meyers的"Effective Modern C++"一书中的第15项,以及这个主题:隐含的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];
  }
Run Code Online (Sandbox Code Playgroud)

std::array声明无法编译,因为我没有定义test()constexpr,这当然是按照标准.如果标准不同,那么没有任何东西可以阻止gcc独立计算test()总是返回一个常量表达式.

这个问题不是问"标准定义了什么",而是"为什么标准就是这样"?

Zan*_*ynx 5

constexpr编译器有时可以计算出编译时常量并使用它之前.但是,程序员永远不会知道何时会发生这种情况.

然后,如果表达式不是编译时间常数,并且他或她意识到需要修复它,程序员会立即得到通知.