【问题标题】:Return lambda from ternary operator [duplicate]从三元运算符返回 lambda [重复]
【发布时间】:2018-11-28 04:50:11
【问题描述】:

如果两个 lambda 都没有捕获任何内容,我可以从三元运算符返回一个 lambda。

 auto lambda1 = 1==1
             ? [] (int a) {std::cout << "First\n";}
             : [] (int a) {std::cout << "Second\n";};

 auto lambda2 = 1==2
             ? [] (int a) {std::cout << "First\n";}
             : [] (int a) {std::cout << "Second\n";};
lambda1(10);
lambda2(10);

这很好用。

但这不是

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()::&lt;lambda(int)&gt;' and 'main()::&lt;lambda(int)&gt;' ? [&amp;n] (int a) {std::cout &lt;&lt; "First\n";}

我想知道为什么捕获相同的变量会改变 lambda 的类型?

【问题讨论】:

标签: c++ c++11 lambda


【解决方案1】:

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

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

所以 lambda3lambda4 具有捕获是彼此不同的独特类型。

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

lambda1lambda2(没有捕获)可以转换为指向函数的指针,并且属于同一类型。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-04
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-17
    相关资源
    最近更新 更多