【发布时间】:2020-09-10 09:48:33
【问题描述】:
从 c++20 开始,我们可以使用 consteval 说明符定义立即函数。当一个函数被声明为consteval 时,对该函数的每次调用都必须产生一个编译时常量,否则程序是错误的。此外,由于 c++20 的 try-catch 块在常量评估上下文中是允许的,但仍然不允许抛出异常。因此,我最初认为consteval 暗示inline 它也暗示noexcept,因为禁止抛出任何异常。正如您在这一点上可以想象的那样,这不是真的:除非您指定noexcept,否则立即函数是一个潜在的抛出函数,其所有负面影响都来自于此。有什么我不知道的原因吗?
【问题讨论】:
-
“所有由此衍生的负面因素” 比如?
-
@JesperJuhl:您不能“语言律师”提出“为什么”的问题,因为规范没有说明“为什么”任何特定功能都是这样的。您不能要求对规范定义的内容进行规范引用。
-
一些算法根据 noexcept 规范执行不同的操作(参见 std::vector::resize() )。此外,编译器可能会删除非抛出函数的异常处理代码
-
为什么应该
consteval函数是noexcept?像这样打破正交性还能获得什么好处? -
@user7769147 确实如此,但它也没有回答问题。
标签: c++ c++20 noexcept consteval