C++ 0x的lambda表达式没有命名类型是不是很糟糕?

GRB*_*GRB 6 c++ lambda c++11

我最近在互联网上阅读了一些关于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;
}
Run Code Online (Sandbox Code Playgroud)

说实话,我实际上看不出这个的用处(特别是考虑到auto接受lambda表达式,所以可以将lambda指定给变量),但是我仍然不认为lambda表达式是匿名类型并且不能仅仅针对一种特定类型(排除所有其他类型).

从本质上讲,我的问题是,lambda表达式是匿名的(在实用程序方面 - 缺少lambda类型是否缺乏某些功能 - 并且哲学上 - lambda表达式总是有意义吗? '类型' auto)?

rlb*_*ond 11

Lambdas是独立的类型.代码

void h(lambda func)
{
     func(2);
}
Run Code Online (Sandbox Code Playgroud)

没有任何意义,因为lambdas没有运行时多态性.回想一下lambda相当于

struct unique_name
{
    return_type operator()(Arg1 a1, Arg2 a2, ... , Argn an)
    {
        code_inside_lambda;
    }
}
Run Code Online (Sandbox Code Playgroud)

这本身就是一种独特的类型.上面的代码与说法相同

void h(class C)
{
     C(2);
}
Run Code Online (Sandbox Code Playgroud)

即使我们保证C有,也没有任何意义operator().你需要一个模板:

template<typename T>
void g(T func)
{
     func(2);
}

int main()
{
    g([](int x){return x + 2;});
}
Run Code Online (Sandbox Code Playgroud)