从5.1.2开始
[19] 与 lambda 表达式关联的闭包类型有一个已删除的(8.4.3)默认构造函数和一个被删除的
复制赋值运算符。它有一个隐式声明的复制构造函数(12.8)并且可能有一个隐式声明的
移动构造函数(12.8)。 [ 注意:复制/移动构造函数以相同的方式隐式定义
因为任何其他隐式声明的复制/移动构造函数都会被隐式定义。 ——尾注]
我正在阅读 C++ Primer 14.8.1,它解释了编译器将 lambda 表达式转换为未命名类的未命名对象。如果默认构造函数被删除,我如何定义不包含 lambda 捕获的 lambda 函数对象?
auto g = [](){};
这在概念上不是一样吗?
class lambdaClass{
public:
lambdaClass() = delete;
lambdaClass& operator=(const lambdaClass&) = delete;
void operator()(){ }
//copy/move constructor and destructor implicitly defined
};
auto g = lambdaClass(); //would be an error since default is deleted.
如果有捕获,则有构造函数other比定义默认构造函数更可以初始化此类对象(只要传递参数)。但如果没有捕获并且删除了默认构造函数,那么从概念上看,可以创建 lambda 类对象似乎并不一致。
编辑:嗯,也许 lambda 类根据其 lambda 捕获创建构造函数的概念是没有根据的,尽管 C++ Primer 中是这样描述的(我在标准中找不到它的引用),因为以下代码甚至无法工作尽管我希望它在概念上:
int sz = 2;
auto a = [sz](){ return sz;};
decltype(a) b(10); //compiler error
decltype(a) b = a; //all good though
之间的关系closure to lambda类似于object to class.
The C++11标准说closure!type 没有默认构造函数,这是正确的,因为它没有说它没有构造函数。
lambda 用于创建闭包。但你引用的段落将会改变为C++14.
ClosureType() = delete; // (until C++14)
ClosureType(const ClosureType& ) = default; // (since C++14)
ClosureType(ClosureType&& ) = default; // (since C++14)
封闭类型不默认可构造 http://en.cppreference.com/w/cpp/concept/DefaultConstructible。闭合类型有a deleted (until C++14)
no (since C++14)
默认构造函数。复制构造函数和移动构造函数是implicitly-declared (until C++14)
宣布as defaulted (since C++14)
并且可以根据复制构造函数和移动构造函数的通常规则隐式定义。
http://en.cppreference.com/w/cpp/language/lambda http://en.cppreference.com/w/cpp/language/lambda
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)