【发布时间】:2020-12-23 19:23:40
【问题描述】:
P0595 引入了std::is_constant_evaluated() 函数。本文讨论了在某些情况下,包含表达式是常量表达式,但编译器不需要在编译时进行评估。给出的例子是:
constexpr double power(double b, int x) {
if (std::is_constant_evaluated() && x >= 0) {
// ...
// return r;
} else {
// Let the code generator figure it out.
return std::pow(b, (double)x);
}
}
double thousand() {
return power(10.0, 3);
}
编译器可以在编译时评估power(10.0, 3),但不是必须的。因此,is_constant_evaluated 返回 false。
因此,本文引入了“明显恒定评估”的概念:
我们的方法是精确识别一组“明显恒定评估”(一个新的技术短语)的表达式,并指定我们的新函数在评估此类表达式期间返回
true,否则返回false。具体来说,我们在“明显常量求值”的表达式集中包含了两种表达式。第一种很简单:标准已经要求常量结果的上下文中的表达式,例如数组的维度或 constexpr 变量的初始化程序。 ...
这对我来说很有意义。然而,标准中的实际措辞让我感到困惑:
e的表达式或转换是明显的常量评估,如果它是:
- 一个常量表达式,或者...
换句话说,标准规定所有的常量表达式都是明显的常量求值,(对我来说)这似乎没有包含表达式出现在需要常量表达式的上下文中的要求。提案备注power(10.0, 3)是核心常量表达式,也是我的理解;这使它成为一个常量表达式。如果所有常量表达式都被明显地进行了常量评估,那么is_constant_evaluated 似乎必须在此处返回 true。
我应该如何理解标准中的定义,使其具有与提案意图一致的精确含义?
【问题讨论】:
标签: c++ language-lawyer c++20