仅通过引用捕获的 lambda 表达式是否保证不会抛出?
Is a lambda-expression that only captures by reference guaranteed not to throw?
对于 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。
相关文章:
- gcc和clang在表达式是否为常量求值的问题上存在分歧
- 表达式 SFINAE:如何根据类型是否包含具有一个或多个参数的函数来选择模板版本
- 编写了一个C++代码来检查表达式是否具有平衡括号并且我的代码未运行.我已经卡了一天了
- 编译器是否强制根据模板参数计算表达式?
- C++:带有大括号初始化列表的函数调用表达式 - 标准是否规定在单个元素列表的微不足道的情况下忽略大括号?
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- 标准库中的任何正则表达式语法是否支持 (?(定义)用于子模式参考?
- 使用 vector 检查表达式中的括号是否平衡
- 如果语句表达式调用函数,则需要测试是否为 true
- 是否可以使用带有模板化参数的特征块表达式作为左值?
- 说编译器可以将下面的表达式"a->i"替换为其值 1 是否正确,因为...?
- 假设相同的 lambda 表达式具有不同的类型是否安全?
- 表达式中使用的枚举器是否与其枚举的基础类型具有相同的类型?
- 在C++中,当表达式涉及对象时,将表达式赋值到对象中时,是否有定义的操作顺序?
- 在 C 和 C++ 中,使用逗号运算符的表达式是否未定义"a = b, ++a;"?
- 是否可以定义以后可以计算的布尔表达式
- (类型)(数学表达式)是否计算此类型的表达式?
- 将任何类型的表达式放在 c++ 的初始化列表中在语法上是否正确?
- 是否有一个上下文表达式`a.b :: c`有意义
- 检查字符串是否包含有效的后缀表达式