【问题标题】:What is Allowed in a consteval Function?consteval 函数中允许什么?
【发布时间】:2021-10-26 10:07:53
【问题描述】:

(对不起,如果这个问题太宽泛而无法回答)

(参考What is Allowed in a constexpr Function?

我知道constexpr 函数对其中允许的内容有一些限制。以下是他们的报价单。

函数体可以包含以下内容:

  • asm 声明
  • goto 语句
  • 带有除 case 和 default 之外的标签的语句
  • 一个尝试块
  • 非文字类型变量的定义
  • 静态或线程存储持续时间变量的定义
  • 不进行初始化的变量定义

我想知道,consteval 函数的限制与上面指定的有何不同。 consteval 函数中是否可以允许但constexpr 函数中不允许,反之亦然。

【问题讨论】:

  • 你提到的限制适用于常量表达式,它比constexpr函数更通用。
  • 我相信 try-blocks 在 C++20 及更高版本中是可以的。你实际上可能没有throw 任何东西。更容易为任一评估模式编写代码。 throw 只是在编译时评估期间转换为编译时错误。
  • @StoryTeller-UnslanderMonica 你能详细说明不允许throw 任何事情吗?它如何转化为编译时错误?
  • 简单。编译器停止常量评估,指向它到达的 throw 表达式并说“错误”。只要它没有到达它,就没有伤害。

标签: c++ function c++20 constexpr consteval


【解决方案1】:

就像constexprconsteval 使函数成为constexpr 函数。需求列表(在 C++20 中从 C++14 版本显着缩小)适用于更广泛的类别。对即时(consteval)函数的调用会受到进一步限制。

【讨论】:

  • 您能否详细说明 C++20 中的需求列表?
  • @KarenBaghdasaryan:这取决于goto/labels 和非自动或非文字变量的定义,甚至那些应该在 C++23 中消失(只留下参数/返回类型、基类和可调用性)。
猜你喜欢
  • 2020-02-15
  • 2019-12-05
  • 2017-05-27
  • 2020-04-20
  • 2019-04-20
  • 2020-12-03
  • 1970-01-01
相关资源
最近更新 更多