仅仅因为一个函数(或构造函数)......
- 被声明为 constexpr 并且
- 函数定义满足 constexpr 要求
...并不意味着编译器将在翻译期间评估 constexpr 函数。我一直在查看 C++11 FDIS(N3242,可在http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/获得)试图确定两件事:
- 编译器何时有义务在翻译期间评估 constexpr 函数?
- 何时允许编译器在翻译期间评估 constexpr 函数?
第 5.19 节第 1 段说常量表达式可以在翻译过程中求值。据我所知,第 5.19 节的其余部分阐述了 constexpr 函数定义中的有效规则。
我知道我可以在翻译期间通过将 constexpr 函数的结果声明为 constexpr 来强制进行 constexpr 评估。像这样:
// Declaration
constexpr double eulers_num() { return 2.718281828459045235360287471; }
// Forced evaluation during translation
constexpr double twoEulers = eulers_num() * 2.0;
static_assert(twoEulers > 5.0, "Yipes!");
到目前为止,我一直无法在 FDIS 中找到以下段落:
- 强制
twoEulers
在翻译过程中进行评估或 - 指定编译器在翻译期间可能或必须评估 constexpr 函数的其他情况。
我特别感兴趣的发现是翻译期间的 constexpr 评估是否由以下因素触发:
- 当传递给 constexpr 函数的所有参数都是文字时,或者
- 重载决议期间隐含的对象参数(第 13.3.1 节第 3 段)是 constexpr 或需要文字(例如对于数组维度),或者
- 完全不同的东西。
如果可能,请在您的回复中引用我可以查找的 FDIS 部分或我可以在 FDIS 中搜索的关键短语。标准中的英语有些迟钝,所以我可能一直在阅读相关段落,完全错过了它们的含义或意图。