如果两个lambda都不捕获任何东西,我可以从三元运算符返回lambda。
int n = 10;
auto lambda3 = 1==1
? [&n] (int a) {std::cout << "First\n";}
: [&n] (int a) {std::cout << "Second\n";};
auto lambda4 = 1==2
? [&n] (int a) {std::cout << "First\n";}
: [&n] (int a) {std::cout << "Second\n";};
lambda3(10);
lambda4(10);
这很好。
但这不是
main.cpp:20:18: error: operands to ?: have different types 'main()::<lambda(int)>' and 'main()::<lambda(int)>' ? [&n] (int a) {std::cout << "First\n";}
错误为/.*project\s(.+)/g
我想知道为什么捕获相同的变量会改变lambda的类型吗?
答案 0 :(得分:1)
8.4.5.1闭合类型[expr.prim.lambda.closure]
- lambda表达式的类型(也是闭包对象的类型)是唯一未命名的非工会类类型,称为闭包类型。
因此,lambda3
和lambda4
具有捕获能力的是彼此不同的唯一类型。
- 没有lambda捕获且满足约束(如果有)的非泛型lambda表达式的闭包类型具有函数指针的转换功能C ++语言链接的参数和返回类型与闭包类型的函数调用运算符相同。
lambda1
和lambda2
(无捕获)可以转换为函数指针,并且具有相同的类型。