lambda具有编译器生成的类型。如果您只是将lambda按原样分配给
我在stackoverflow中看到,人们这样写lambda:
int main() {
auto f1 = +[](){};
auto f2 = [](){};
return 0;
}
(1(+
在f1
表达中的实际作用是什么?我尝试添加捕获,然后f1
没有编译,但错误对我来说是不可读的:
auto f1 = +[=](){}; // fail to compile
auto f2 = [=](){};
错误为:
invalid argument type '(lambda at .xxx.cpp:4:16)' to unary expression
auto f1 = +[=](){};
(2( 这个错误表示什么?
谢谢。
auto
变量,那么auto
变量的类型将被推断为lambda的生成类型。
非捕获lambda是隐式可转换为普通函数指针。通过将+
放在lambda前面,lambda被显式地转换为函数指针,然后auto
变量的类型将被推导为函数指针类型,而不是lambda类型。
捕获lambda的根本无法转换为函数指针,这就是出现编译器错误的原因。
(1(它将不带捕获的lambda转换为函数指针。
(2( 它表示您将按值捕获,在这种情况下,无法转换为函数指针。