从三元运算符返回lambda

时间:2018-11-28 04:50:12

标签: c++ c++11 lambda

如果两个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的类型吗?

1 个答案:

答案 0 :(得分:1)

  

8.4.5.1闭合类型[expr.prim.lambda.closure]

     
      
  1. lambda表达式的类型(也是闭包对象的类型)是唯一未命名的非工会类类型,称为闭包类型。
  2.   

因此,lambda3lambda4具有捕获能力的是彼此不同的唯一类型。

  
      
  1. 没有lambda捕获且满足约束(如果有)的非泛型lambda表达式的闭包类型具有函数指针的转换功能C ++语言链接的参数和返回类型与闭包类型的函数调用运算符相同。
  2.   

lambda1lambda2(无捕获)可以转换为函数指针,并且具有相同的类型。