gpt4 book ai didi

c++ - 如何理解 "manifeSTLy constant-evaluated"的定义?

转载 作者:行者123 更新时间:2023-12-03 10:05:00 25 4
gpt4 key购买 nike

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返回假。
因此,论文引入了“明显常量评估”的概念:

Our approach is to precisely identify a set of expressions that are "manifestly constant-evaluated" (a new technical phrase) and specify that our new function returns true during the evaluation of such expressions and false otherwise.

Specifically, we include two kinds of expressions in our set of expressions "manifestly constant-evaluated". The first kind is straightforward: Expressions in contexts where the standard already requires a constant result, such as the dimension of an array or the initializer of a constexpr variable. ...


这对我来说很有意义。然而,标准中的实际措辞让我感到困惑:

An expression or conversion e is manifestly constant-evaluated if it is:

  • a constant-expression, or ...

换句话说,该标准规定所有常量表达式都明显是常量计算的,这(对我来说)似乎没有包含表达式出现在需要常量表达式的上下文中的要求。提案说明 power(10.0, 3)是核心常量表达式,这也是我的理解;这使它成为一个常量表达式。如果所有常量表达式都显然是常量计算的,那么似乎 is_constant_evaluated必须在这里返回 true。
我应该如何理解标准中的定义,使其具有与提案意图一致的准确含义?

最佳答案

这是我最喜欢的。它没有说“一个常量表达式”。它说“一个常量表达式。”†
常量表达式是一个语法术语。它是 C++ 语法中需要常量表达式的地方的替代品。
例如,template-argument 的语法(特别是语法)。是常量表达式(或类型 id 或 id 表达式),因此此规则意味着当评估作为模板参数出现的常量表达式时,该评估显然是常量评估的。
相比之下,if constexpr中的语法不采用常量表达式,它只是 takes a condition .所以这个子弹不足以覆盖if constexpr ,这就是为什么有一个特殊的额外项目符号来涵盖“constexpr if 语句的条件”。

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

关于c++ - 如何理解 "manifeSTLy constant-evaluated"的定义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65429853/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com