Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++λ表达式能抛出吗?_C++_Exception_C++11_Lambda - Fatal编程技术网

C++λ表达式能抛出吗?

C++λ表达式能抛出吗?,c++,exception,c++11,lambda,C++,Exception,C++11,Lambda,我找不到任何关于在构造闭包对象时抛出异常的信息 显然,在向量的复制构造过程中,此表达式可能会抛出: auto v = std::vector<int>(1000000); [v]{}; 我现在只讲闭包对象的构造。打电话没意思 我阅读了5.1.2 Lambda表达式[expr.prim.Lambda],但没有发现nothrow担保的任何特殊之处。根据标准,§5.1.2/3: lambda表达式的类型(也是闭包对象的类型)是唯一的、未命名的非一致性 类类型-称为闭包类型-其属性如下所述

我找不到任何关于在构造闭包对象时抛出异常的信息

显然,在向量的复制构造过程中,此表达式可能会抛出:

auto v = std::vector<int>(1000000);
[v]{};
我现在只讲闭包对象的构造。打电话没意思

我阅读了5.1.2 Lambda表达式[expr.prim.Lambda],但没有发现nothrow担保的任何特殊之处。

根据标准,§5.1.2/3:

lambda表达式的类型(也是闭包对象的类型)是唯一的、未命名的非一致性 类类型-称为闭包类型-其属性如下所述。此类类型不是 a合计8.5.1。闭包类型在最小的块范围、类范围或命名空间中声明 包含相应lambda表达式的范围

简而言之,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);
注意:这并不是编译器创建的类的外观。该标准为生成的类列出了具体的要求,为了简洁起见,我省略了这些要求

现在,假设您像这样实例化该类:

[&]{};
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的实例化是否会引发异常?如果是这样,那么闭包对象的构造可以抛出异常。在这种情况下,它不能

至于提供nothrow保证,该标准不要求编译器对此负责,但也不阻止他们这样做。第5.1.2/3条末尾规定:

实现可以定义闭包 类型与下面描述的不同,前提是这不会改变 除更改外的其他程序:

-闭合类型的尺寸和/或对齐方式

-闭包类型是否可以复制第9条

-闭合类型是否为标准布局类第9条,或

-闭包类型是否为POD类第9条

根据标准§5.1.2/3:

lambda表达式的类型(也是闭包对象的类型)是唯一的、未命名的非一致性 类类型-称为闭包类型-其属性如下所述。此类类型不是 a合计8.5.1。闭包类型在最小的块范围、类范围或命名空间中声明 包含相应lambda表达式的范围

简而言之,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);
注意:这并不是编译器创建的类的外观。该标准为生成的类列出了具体的要求,为了简洁起见,我省略了这些要求

现在,假设您像这样实例化该类:

[&]{};
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的实例化是否会引发异常?如果是这样,那么闭包对象的构造可以抛出异常。在这种情况下,它不能

至于提供nothrow保证,该标准不要求编译器对此负责,但也不阻止他们这样做。第5.1.2/3条末尾规定:

实现可以定义闭包 类型与下面描述的不同,前提是这不会改变 除更改外的其他程序:

-闭合类型的尺寸和/或对齐方式

-闭包类型是否可以复制第9条

-闭合类型是否为标准布局类第9条,或

-闭包类型是否为POD类第9条


正如从lambda函数调用的任何“正常”函数都可能抛出一样,您对lambda函数的怀疑是什么?正如从lambda函数调用的任何“正常”函数都可能抛出一样,您对lambda函数的怀疑是什么?请注意,lambda不需要有引用成员。有些实现只是使用一个指向堆栈帧的指针,而不是N个引用。挑剔-除非您标记lambda可变,否则生成的运算符是const。感谢您调用这些。我故意省略了一些细节,包括删除的构造函数,但最好指出这一点,以便读者了解。我已经编辑了答案以包含免责声明。请注意,lambda不需要有引用成员。有些实现只是使用一个指向堆栈帧的指针,而不是N个引用。挑剔-除非您标记lambda可变,否则生成的运算符是const。感谢您调用这些。我故意省略了一些细节,包括删除的构造函数,但最好指出这一点,以便读者了解。我对答案进行了编辑,添加了免责声明。