Bri*_*ian 5 c++ language-lawyer c++20
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);
}
Run Code Online (Sandbox Code Playgroud)
编译器可以power(10.0, 3)
在编译时进行评估,但不是必需的。因此,is_constant_evaluated
返回false。
因此,论文引入了“明显常量评估”的概念:
我们的方法是精确识别一组“明显常量评估”(一个新的技术短语)的表达式,并指定我们的新函数
true
在评估此类表达式期间返回,false
否则返回。具体来说,我们在“明显常量评估”的表达式集中包含两种表达式。第一种很简单:标准已经要求常量结果的上下文中的表达式,例如数组的维数或 constexpr 变量的初始值设定项。...
这对我来说很有意义。然而,标准中的实际措辞让我感到困惑:
一个表达式或转换显然
e
是常量求值的,如果它是:
- 一个常量表达式,或...
换句话说,标准规定所有常量表达式都明显是常量计算的,这(对我来说)似乎没有包含表达式出现在需要常量表达式的上下文中的要求。提案备注power(10.0, 3)
是核心不变的表达,也是我的理解;这使它成为一个常量表达式。如果所有常量表达式都显然是常量计算的,那么这里似乎is_constant_evaluated
必须返回 true。
我应该如何理解标准中的定义,使其具有与提案意图一致的准确含义?
Bar*_*rry 10
这是我最喜欢的。它没有说“一个常量表达式”。它说“一个常量表达式”。†
常量表达式是一个语法术语。它是 C++ 语法中需要常量表达式的地方的替代品。
例如,模板参数的文法(特别是文法)是constant-expression(或type-id或id-expression),因此该规则意味着当评估作为模板出现的常量表达式时-论点,该评估显然是常量评估。
相反,语法if constexpr
并没有采取常数表达式,它只是需要一个条件。所以这个项目符号不足以涵盖if constexpr
,这就是为什么有一个特殊的额外项目符号来涵盖“constexpr if 语句的条件”。
†想象一下必须口头回答这个问题。你可以听到连字符,对吧?
归档时间: |
|
查看次数: |
135 次 |
最近记录: |