Ant*_*ant 4 c++ lambda constructor default
从5.1.2开始
[19]与lambda表达式关联的闭包类型具有已删除(8.4.3)的默认构造函数和已删除的副本分配运算符。它具有一个隐式声明的副本构造函数(12.8),并且可能具有一个隐式声明的move构造函数(12.8)。[注意:复制/移动构造函数的隐式定义与其他任何隐式声明的复制/移动构造函数的隐式定义相同。—尾注]
我正在阅读C ++ Primer 14.8.1,它解释了Lambda表达式被编译器翻译成未命名类的未命名对象。如果删除默认构造函数,如何定义不包含lambda捕获的lambda函数对象?
auto g = [](){};
Run Code Online (Sandbox Code Playgroud)
这在概念上与...不同吗?
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.
Run Code Online (Sandbox Code Playgroud)
如果有捕获,则将定义除默认构造函数以外的其他构造函数,并且可以初始化此类对象(只要传递了参数)就可以了。但是,如果没有捕获并且删除了默认构造函数,则在概念上似乎无法创建lambda类对象。
编辑:嗯,尽管这是C ++ Primer中描述的方式,但是lambda类根据其lambda捕获创建构造函数的概念是没有根据的(因为我在标准中找不到该引用),因为以下代码甚至无法正常工作尽管我希望它在概念上:
int sz = 2;
auto a = [sz](){ return sz;};
decltype(a) b(10); //compiler error
decltype(a) b = a; //all good though
Run Code Online (Sandbox Code Playgroud)
一个之间的关系闭合到拉姆达类似于对象到类。
在C ++ 11标准说,封!type没有默认构造函数,这是正确的,因为它没有说它没有构造函数。
lambda用于创建闭包。但是您引用的段落将针对C ++ 14更改。
ClosureType() = delete; // (until C++14)
ClosureType(const ClosureType& ) = default; // (since C++14)
ClosureType(ClosureType&& ) = default; // (since C++14)
Run Code Online (Sandbox Code Playgroud)
闭包类型不是DefaultConstructible。闭包类型具有
a deleted (until C++14)
no (since C++14)
默认构造函数。复制构造函数和move构造函数被implicitly-declared (until C++14)
声明,as defaulted (since C++14)
并且可以根据复制构造函数和move构造函数的通常规则隐式定义。
http://en.cppreference.com/w/cpp/language/lambda