Skip to main content
 首页 » 编程设计

c++之为什么捕获变量会使 lambda 的类型唯一

2025年01月19日11davidwang456

这个问题在这里已经有了答案:





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;};