Lambda 黑魔法采取不同类型

eth*_*ham 5 c++ lambda auto

试图找到另一种简单地序列化我的代码的方法,我有一个愚蠢的想法来尝试这个不可能的事情。但它奏效了。我真的很想知道为什么:

template <typename C>
void f(C c)
{
    int a = 1;
    float b = 1.5f;
    c(a);
    c(b);
}

int main()
{
    f([](auto v){
        std::cerr << v << "\n";
    });
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我查看了生成的程序集(g++-9.3 -O0 -g -S -fverbose-asm test.cpp -o test.s),似乎生成了两个不同的 lambda:一个采用浮点数,另一个采用一个整数。这是黑魔法吗?有没有人知道标准并且可以对此进行更多解释?

Jar*_*d42 10

通用 lambda 与

struct lambda
{
    template <typename T>
    auto operator()(T v) const
    {
        std::cerr << v << "\n";
    }
// ...
};
Run Code Online (Sandbox Code Playgroud)

lambda 本身不是模板,但它的成员operator()是。


cig*_*ien 6

这个电话:

f([](auto v){
        std::cerr << v << "\n";
    });
Run Code Online (Sandbox Code Playgroud)

正在将通用 lambdaf作为参数传递给coperator()由于auto参数的原因,泛型 lambda 是具有模板化成员的 lambda 。

因此,当您拨打以下电话时:

c(a);  // int argument
c(b);  // float argument
Run Code Online (Sandbox Code Playgroud)

编译器将实例化拉姆达的成员的一个版本operator()int,和成员的一个版本operator()float