为什么我的函数返回一个lambda似乎被转换成一个函数变成一个int?



给定返回lambda

的函数
auto foo(int y) {
return [=](int x) { return x + y; };
}

GCC和Clang产生以下程序集

foo(int):
mov     eax, edi
ret

就我所知它等于这个

int bar(int n) {
return n;
}

然而bar似乎如预期的那样起作用。

auto fn = foo(2);
std::cout << fn(3); //prints 5

请记住闭包类型是类类型。您的功能类似于:

auto foo(int y) {
// return [=](int x) { return x + y; };
struct closure_type {
int y;
auto operator()(int x) const { return x + y; }
};
return closure_type{ y };
}

并且,一旦类型被删除,返回int类型和返回带有单个int数据成员的普通结构体之间实际上没有区别。

如果你改变int返回函数的类型,你会有完全相同的体验:

using closure_type = decltype(foo(int{}));
auto fn = std::bit_cast<closure_type>(bar(2));
std::cout << fn(3); //prints 5

最新更新