这个问题在这里已经有了答案:
Initializing capturing lambda in ternary operator
(3 个回答)
1年前关闭。
在以下最小示例中:
int main()
{
const int foo = 1;
const auto a = foo == 1 ? [](){return 42;} : [](){return 4;};
const auto b = foo == 1 ? [foo](){return 42;} : [foo](){return 4;};
}
a
很好。
b
然而不是,因为:
<source>:5:29: error: incompatible operand types ('(lambda at <source>:5:31)' and '(lambda at <source>:5:53)')
const auto b = foo == 1 ? [foo](){return 42;} : [foo](){return 4;};
^ ~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~
为什么会这样?又怎么会意
b
被获得?
请您参考如下方法:
捕获不会使 lambda 变得独一无二;根据定义,lambda 类型已经是唯一的。但是,非捕获 lambda 可以转换为函数指针,这会在您的第一个示例中创建一个通用类型。
你解决你的具体例子如下:
const auto b = [foo](){ return (foo == 1) ? 42 : 4;};