采取不同类型的 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()
是。
试图找到另一种方法来简单地序列化我的代码,我有一个愚蠢的想法来尝试这个不可能的事情。但它奏效了。我真的很想知道为什么:
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()
是。