【发布时间】: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