采取不同类型的 Lambda 黑魔法

Lambda black magic taking different types

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

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;
}

我查看了生成的程序集 (g++-9.3 -O0 -g -S -fverbose-asm test.cpp -o test.s),似乎生成了两个不同的 lambda:一个接受一个浮点数,另一个接受一个整数。这是黑魔法吗?有谁知道这个标准,可以详细解释一下吗?

这次通话:

f([](auto v){
        std::cerr << v << "\n";
    });

将通用 lambda 作为参数 c 传递给 f。由于 auto 参数,通用 lambda 具有模板化成员 operator()

因此,当您进行以下调用时:

c(a);  // int argument
c(b);  // float argument

编译器将使用 int 实例化 lambda 成员 operator() 的一个版本,以及使用 float.

实例化成员 operator() 的一个版本

通用的 lambda 大部分类似于

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

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