gpt4 book ai didi

c++ - 为什么立即函数在默认情况下不是 noexcept,为什么允许它们是 noexcept(false)?

转载 作者:行者123 更新时间:2023-12-01 14:25:27 25 4
gpt4 key购买 nike

从 c++20 开始,我们可以使用 consteval 说明符定义立即数函数。当一个函数被声明为 consteval 时,对该函数的每次调用都必须产生一个编译时常量,否则该程序就是病式的。此外,由于 c++20 try-catch block 在常量评估上下文中是允许的,但仍然不允许抛出异常。正因为如此,我最初认为 consteval 意味着 inline 它也意味着 noexcept 因为抛出任何异常都是被禁止的。正如您现在可以想象的那样,这是不正确的:除非您指定 noexcept,否则立即函数是一个潜在的抛出函数,具有由此派生的所有负面影响。有什么我不知道的原因吗?

最佳答案

Some algorithms performs different actions depending on noexcept specification (see std::vector::resize() ). Also the compiler may remove exception handling code for a non-throwing function

立即函数在编译时调用。虽然 C++20 现在确实有编译时容器,但它们的性能与运行时代码有点无关。他们可以很容易地使用基于 if(is_constant_evaluated) 的不同内部实现,这比 noexcept 查询更有益。

但即便如此,constexpr 编码的目标之一是使编译时代码类似于运行时代码。因此,如果您有一个只应在编译时存在并且具有 consteval 移动构造函数的类,那么用户应该将其视为运行时类。因此,如果他们要在运行时类中创建移动构造函数 noexcept,那么它也应该在编译时类中。

这非常重要,因为它保留了编译时代码能够在该语言的 future 版本中抛出异常的能力。如果 P0709:静态异常进入标准,这尤其有可能。

此外,即时函数只存在于编译时,这是一个没有异常处理的上下文。因此,无论编译器为 constexpr 函数构建代码做什么,它都不涉及异常处理机制。因此,为了代码生成目的而隐式设置它们 noexcept 是没有意义的。

最后,consteval 最终构建为对 constexpr 函数声明的一个小改动。甚至隐含的 inline 也来自 consteval,意思是 constexpr,而不是 consteval 本身。向 consteval 添加新的语义将产生重大变化。

关于c++ - 为什么立即函数在默认情况下不是 noexcept,为什么允许它们是 noexcept(false)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61973903/

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