给定返回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