从三元运算符返回 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()::<lambda(int)>' and 'main()::<lambda(int)>' ? [&n] (int a) std::cout << "First\n";
我想知道为什么捕获相同的变量会改变 lambda 的类型?
【问题讨论】:
见解释***.com/a/11406936/8769985 【参考方案1】:8.4.5.1 闭包类型 [expr.prim.lambda.closure]
lambda 表达式的类型(也是闭包对象的类型)是一个唯一未命名的非联合类类型,称为闭包类型。
所以 lambda3
和 lambda4
具有捕获是彼此不同的独特类型。
满足约束(如果有)的非泛型 lambda 表达式没有 lambda-capture 的闭包类型具有到 指向函数的指针的转换函数C++ 语言链接具有与闭包类型的函数调用运算符相同的参数和返回类型。
lambda1
和lambda2
(没有捕获)可以转换为指向函数的指针,并且属于同一类型。
【讨论】:
以上是关于从三元运算符返回 lambda [重复]的主要内容,如果未能解决你的问题,请参考以下文章