对于 C++ 中的匿名函数,除了写 auto 外,还可以使用 std::function 作为类型接受匿名函数:
1 | std::function<void(int)> func = [](int x) { |
问题来了,刚开始的时候我以为 std::function<void(int)> 就是匿名函数的返回类型,在 github 上给别人发送 PR 时就发生了笑话。
实际上这两个类型并不相同,function 是一个类型擦除容器,而 lambda 匿名类型简单来说就是重载了 operator() 的类。由于 std::function 有转换构造函数,lambda 表达式得以调用这个转换构造函数,构造出这一个 std::function对象,所以这个赋值发生了隐式类型转换。
在一些代码中,我们可能无法保留原有的数据类型,上面的匿名函数就是典型的例子。这个时候需要用一种通用的类型去使用它们,需要去掉对象原有的数据类型,也就是类型擦除 (Type Erasure)。