从三元运算符返回 lambda [重复]

Posted

技术标签:

【中文标题】从三元运算符返回 lambda [重复]【英文标题】:Return lambda from ternary operator [duplicate] 【发布时间】: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 的类型?

【问题讨论】:

见解释***.com/a/11406936/8769985 【参考方案1】:

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

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

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

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

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

【讨论】:

以上是关于从三元运算符返回 lambda [重复]的主要内容,如果未能解决你的问题,请参考以下文章

python lambda表达式与三元运算

python 三元运算与lambda

Python 函数进阶-lambda匿名函数和三元运算符

三元运算&匿名函数lambda

Python基础-lambda表达式与三元运算

python中的lambda表达式与三元运算