我最近在互联网上阅读了一些关于 lambda 表达式的内容,在我看来,C++0x 的 lambda 表达式不会有一个(或多个类型)专门绑定到 lambda 表达式——换句话说,lambda表达式只会匹配模板参数或auto
参数/变量。如此处所述,会发生什么
支持 lambda 的编译器将为每个 lambda 表达式创建一个唯一的匿名函子类型
我的问题是,这是一件坏事吗?有一些只匹配 lambda 表达式的关键字是否有意义,例如lambda
,它的工作方式如下
void f(std::function<int(int)> func)
{
func(2);
}
template<typename T>
void g(T func)
{
func(2);
}
void h(lambda func)
{
func(2);
}
int main()
{
int fpointer(int);
struct { int operator()(int var) { return var; } } functor;
f(fpointer); //ok (actually a linker error, but for the sake of example)
f(functor); //ok
f([](int var) { return var; }); //ok
g(fpointer); //ok
g(functor); //ok
g([](int var) { return var; }); //ok
h(fpointer); //error -- function pointer isn't a lambda expr
h(functor); //error -- functor isn't a lambda expr
h([](int var) { return var; }); //ok
return 0;
}
老实说,我实际上看不到它的用处(特别是考虑到auto
接受 lambda 表达式,因此可以将 lambda 分配给一个变量),但我仍然认为 lambda 表达式是匿名类型并且不能专门绑定到一种特定类型(排除所有其他类型)。
从本质上讲,我的问题是,lambda 表达式是匿名的是否可以(无论是在实用性方面 - 缺乏lambda
类型是否使我们失去了某些功能 - 并且在哲学上 - lambda 表达式总是有意义吗? '类型' auto
)?