P0595 https://wg21.link/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
返回假。
因此本文引入了“明显不断评估”的概念:
我们的方法是精确识别一组“明显常量求值”(新技术短语)的表达式,并指定我们的新函数返回true
在评估此类表达式和false
否则。
具体来说,我们在“明显常量求值”的表达式集中包含两种表达式。第一种很简单:标准已经要求常量结果的上下文中的表达式,例如数组的维数或 constexpr 变量的初始值设定项。 ...
这对我来说很有意义。然而,标准中的实际措辞让我感到困惑:
表达式或转换e
is 明显不断评估如果是:
换句话说,该标准规定所有常量表达式显然都是常量计算的,这(对我来说)似乎没有包含表达式出现在需要常量表达式的上下文中的要求。该提案指出power(10.0, 3)
是一个核心常量表达式,这也是我的理解;这使它成为一个常量表达式。如果所有常量表达式显然都是常量计算的,那么看起来is_constant_evaluated
此处必须返回 true。
我应该如何理解标准中的定义,使其具有与提案意图一致的准确含义?
This is my favorite. It doesn't say " a constant expression." It says "a constant-expression."†
常量表达式是一个语法术语。它是 C++ 语法中强制使用常量表达式的地方的替代品。
例如,语法(具体来说,语法)模板参数 http://eel.is/c++draft/temp.names#nt:template-argument is 常量表达式 (or a type-id or an id-表达式),所以这条规则意味着当评估一个常量表达式显示为模板参数,该评估显然是持续评估的。
相比之下,语法中if constexpr
does not take a 常量表达式, 它只是takes a 状况 http://eel.is/c++draft/stmt.select.general#nt:selection-statement。所以这颗子弹不足以覆盖if constexpr
,这就是为什么有一个特殊的额外项目符号来涵盖“constexpr if 语句的条件”。
† Imagine having to answer this question verbally. You can hear the hyphen, right?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)