给定以下返回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的功能似乎和预期的一样。
bar
auto fn = foo(2); std::cout << fn(3); //prints 5
wlzqhblo1#
记住闭包类型是类类型,你的函数类似于:
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
1条答案
按热度按时间wlzqhblo1#
记住闭包类型是类类型,你的函数类似于:
而且,一旦类型被移除,返回int和返回具有单个int数据成员的普通结构体之间实际上没有区别。
如果你改变了类型,你会有与返回int的函数完全相同的体验: