【问题标题】:How to understand the definition of "manifestly constant-evaluated"?如何理解“明显恒定评估”的定义?
【发布时间】: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


    【解决方案1】:

    这是我的最爱。它没有说“一个常量表达式”。它说“一个常量表达式。”

    constant-expression 是一个语法术语。它是 C++ 语法中要求使用常量表达式的那些地方的替代品。

    例如,template-argument 的语法(特别是语法)是 constant-expression(或 type-idid-表达式),所以这条规则意味着当评估一个出现为模板参数常量表达式时,这个评估显然是常量评估的。 p>

    相比之下,if constexpr 中的语法确实采用常量表达式,它只是takes a condition。所以这个项目符号不足以涵盖if constexpr,这就是为什么有一个特殊的额外项目符号来涵盖“constexpr if 语句的条件”。


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

    【讨论】:

    • 不仅是hypen,还有斜体。我们是否已经到了无法大声描述 C++ 的地步?仅仅人类的语音模式已经不够用了?
    • 不要忘记无衬线字体。
    猜你喜欢
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-30
    • 2017-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多