c++ 为什么我的返回lambda的函数,看起来像是被转换成了一个int的函数?

brjng4g3  于 2023-01-03  发布在  其他
关注(0)|答案(1)|浏览(105)

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

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

相关问题