仅通过引用捕获的 lambda 表达式是否保证不会抛出?

Is a lambda-expression that only captures by reference guaranteed not to throw?

本文关键字:是否 表达式 引用 lambda      更新时间:2023-10-16

对于 C++20 P0052 的scope_guard(以及许多其他风格的示波器防护(,请考虑以下典型用例:

auto f = std::fopen(/*...*/);
scope_exit guard_f([&](){ std::fclose(f); });

代码依赖于 lambda 表达式本身(闭包对象的构造(不会抛出。C++标准如何保证这一点?

我阅读了标准的章节(§7.5.5 Lambda 表达式(,没有发现关于 lambda 构造函数noexcept性的说法。

在解释标准时,我们应该假设表达式的评估除了标准明确指定的内容之外没有任何可观察的影响(除非标准指定行为是未定义、未指定或实现定义的(。

你肯定会同意1 + 1表达的评估永远不会抛出。[expr.add](控制内置加法运算符(中是否必须有一个句子明确指出不会引发异常?同样,在[expr.prim.lambda]中也不需要任何这样的句子。(当然,如果任何捕获的初始化都会抛出,则 lambda 闭包对象的创建可能会抛出。这在 [expr.prim.lambda.capture]/15 中得到了暗示,它指出由 copy 捕获的实体是直接初始化的,并且被显式解释,例如通过 [except.spec]/6 和 [intro.execution]/3.3。所有引用均指向 C++20。

相关文章: