c++ lambda表达式能抛出吗?
Can C++ lambda-expression throw?
我找不到任何关于在构造闭包对象期间抛出异常的信息。
没有注意到这个表达式在vector的复制构造过程中可能抛出:
auto v = std::vector<int>(1000000);
[v]{};
但是像这样的空或"引用"捕获列表呢?
[&]{};
我现在只讨论闭包对象的构造。打电话没什么意思。
我读了5.1.2 Lambda expressions [expr.prim.lambda]
,但是没有发现nothrow保证有什么特别之处
根据标准(草案n3337),§5.1.2/3:
lambda表达式的类型(也是闭包对象的类型)是唯一的、未命名的非联合类型类类型-称为闭包类型-其属性将在下面描述。这个类类型不是一个集合(8.5.1)。闭包类型在最小的块作用域、类作用域或命名空间中声明
简而言之,lambda表达式最终实例化了一个匿名类型(只有编译器知道),它包含存储捕获列表中指示的值的成员变量。假设您看到一个类,它看起来像这样:
class __IgnoreMe__
{
std::vector<int>& _v;
public:
__IgnoreMe__(std::vector<int>& v)
: _v(v)
{
}
void operator()()
{
}
};
(注意:这不是编译器创建的类的确切外观。该标准列出了生成类的特定需求,为简洁起见,我将其省略。)
现在假设你像这样实例化这个类:
auto v = std::vector<int>(1000000);
auto my_lambda = __IgnoreMe__(v);
my_lambda
的实例化可以抛出异常吗?如果是,那么闭包对象的构造可以抛出异常。(在这种情况下,它不能。)
实现可以定义闭包类型的可观察行为与下面描述的不同程序,而不是修改:
-闭包类型
的大小和/或对齐方式-闭包类型是否可复制(条款9),
—闭包类型是标准布局类(第9条)还是
-闭包类型是否为POD类(第9条)。
相关文章:
- 这 4 个 lambda 表达式之间有什么区别?
- 使用成员在类中创建 lambda 表达式
- 将 lambda 表达式传递给 std::function in C++
- 在 lambda 表达式中使用 std::atomic
- &&对lambda表达式有什么好处?
- Tbb 库:错误:编写自定义类函数而不是 lambda 表达式时,对函数的调用不匹配
- 列表.erase 中的 lambda 表达式
- 使用 lambda 表达式的 Raspbian G++ 8.3.0 导致 ']' 之前的预期主表达式 - 即使标准设置为 c++14
- 仅通过引用捕获的 lambda 表达式是否保证不会抛出?
- C++: priority_queue:模板参数中的 lambda 表达式
- 容器如何处理 lambda 表达式的参数
- 在C++ Lambda 表达式中,为什么人们更喜欢按值捕获而不是作为参数传递?
- 如何在 lambda 表达式中传递变量?
- 针对 std::function 的 lambda 表达式和模板推导:为什么会这样?
- 如何修改Lambda表达式以将输出放入文本文件
- C++如何使用lambda表达式来捕获上一次迭代的值
- 为什么Qt在信号和插槽中为lambda表达式抛出错误?
- C++:从捕获函数参数的函数返回 lambda 表达式
- C++ Lambda 表达式:通过 ref 开销捕获
- Qt 连接无法识别 lambda 表达式