试图找到另一种简单地序列化我的代码的方法,我有一个愚蠢的想法来尝试这个不可能的事情。但它奏效了。我真的很想知道为什么:
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()是。
这个电话:
f([](auto v){
std::cerr << v << "\n";
});
Run Code Online (Sandbox Code Playgroud)
正在将通用 lambdaf作为参数传递给c。operator()由于auto参数的原因,泛型 lambda 是具有模板化成员的 lambda 。
因此,当您拨打以下电话时:
c(a); // int argument
c(b); // float argument
Run Code Online (Sandbox Code Playgroud)
编译器将实例化拉姆达的成员的一个版本operator()用int,和成员的一个版本operator()用float。