【发布时间】:2010-12-02 10:06:04
【问题描述】:
我最近在互联网上阅读了一些关于 lambda 表达式的内容,在我看来,C++0x 的 lambda 表达式不会有一个(或多个)专门绑定到 lambda 表达式的类型——在其他换句话说,lambda 表达式只会匹配模板参数或auto 参数/变量。正如here 所述,会发生什么
支持 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)?
【问题讨论】:
-
听起来你好像不知道你也可以使用
std::function<int(int)>接受 lambda 表达式。 -
我是,但是由于一般功能与
auto的工作方式相匹配(afaik),我认为没有必要添加 another 组示例函数/函数调用(但它是还是值得一提,所以谢谢 litb) -
我认为对 auto 存在误解。 auto 不能用作函数中的参数类型。它不是一种类型。 auto 只是说“从初始化程序中推断出类型,因为我太懒或无法命名类型”。
-
在这种情况下,我已经更改了
auto参数。我仍然相信你可以做到auto = [](int a) { ... };但是(......对吗?;)) -
op()的全部目的是您不必担心函子类型。现在,如果您将某些内容限制为仅 lambdas(我当然认为实现将提供一些__is_lambda元函数或您可以与enable_if一起使用的东西),那么摆脱接受函数指针等的能力会有什么意义。我不'没有看到任何东西,我相信它没有任何意义。