gpt4 book ai didi

c++ - 为什么这个 c++ lambda 函数不能编译?

转载 作者:太空狗 更新时间:2023-10-29 19:37:37 24 4
gpt4 key购买 nike

为什么编译失败:

int myVar = 0;
myVar ? []()->void{} : []()->void{};

出现以下错误消息:

Error 2 error C2446: ':' : no conversion from 'red_black_core::`anonymous-namespace'::< lambda1>' to red_black_core::anonymous-namespace::< lambda0>

虽然这符合正确:

void left()
{}
void right()
{}

int myVar = 0;
myVar ? left() : right();

最佳答案

?: 运算符的返回类型必须从它的两个操作数中推导出来,确定这种类型的规则非常复杂。 Lambda 不满足它们,因为它们不能相互转换。因此,当编译器试图计算出 ?: 的结果时,不会有结果,因为这两个 lambda 不能相互转换。

但是,当您尝试计算函数时,您实际上调用了它们,但没有调用 lambda。所以当你调用函数时,它们都是void,所以?:的返回类型是void。

这个

void left()
{}
void right()
{}

int myVar = 0;
myVar ? left() : right();

相当于

int myVar = 0;
myVar ? [](){}() : [](){}();

注意最后的额外 () - 我实际上调用了 lambda。

你原本拥有的相当于

compiler_deduced_type var;
if (myVar)
var = [](){};
else
var = [](){};

但是- 不存在可以同时是 lambda 的类型。编译器完全有权将两个 lambda 设为不同的类型。

编辑:

我想起了什么。在最新的标准草案中,没有捕获的 lambda 可以隐式转换为具有相同签名的函数指针。也就是说,在上面的代码中,compiler_deduced_type 可以是 void(*)()。但是,我知道 MSVC 不包含此行为,因为在他们实现 lambda 时未定义此行为。这可能是 GCC 允许它而 MSVC 不允许的原因 - GCC 的 lambda 支持比 MSVC 的更新得多。

关于c++ - 为什么这个 c++ lambda 函数不能编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4691056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com