如何理解“明显恒定评估”的定义?

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-idid-expression),因此该规则意味着当评估作为模板出现的常量表达式-论点,该评估显然是常量评估。

相反,语法if constexpr没有采取常数表达式,它只是需要一个条件。所以这个项目符号不足以涵盖if constexpr,这就是为什么有一个特殊的额外项目符号来涵盖“constexpr if 语句的条件”。


想象一下必须口头回答这个问题。你可以听到连字符,对吧?

  • 不要忘记无衬线字体。 (5认同)
  • 不仅是连字符,还有斜体。我们是否已经到了无法大声描述 C++ 的地步了?仅仅人类的语音模式已经不够了吗? (3认同)