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

标签 c++ lambda c++11

我最近在互联网上阅读了一些关于 lambda 表达式的文章,在我看来,C++0x 的 lambda 表达式不会有一个(或多个)单独绑定(bind)到 lambda 表达式的类型——在其他情况下换句话说,lambda 表达式将只匹配模板参数或 auto 参数/变量。发生了什么,如所述here , 是吗

Compilers that support lambdas will create a unique anonymous functor type for each lambda expression

我的问题是,这是一件坏事吗?使用一些只匹配 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 表达式是匿名类型,不能专门绑定(bind)到一种特定类型(排除所有其他类型)。

从本质上讲,我的问题是,lambda 表达式是匿名的(无论是在实用性方面——缺少 lambda 类型是否使我们失去了一些功能——以及哲学上—— - lambda 表达式始终具有“类型”auto) 真的有意义吗?

最佳答案

Lambda 是独立的类型。代码

void h(lambda func)
{
     func(2);
}

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

struct unique_name
{
    return_type operator()(Arg1 a1, Arg2 a2, ... , Argn an)
    {
        code_inside_lambda;
    }
}

这本身就是一个独特的类型。上面的代码相当于说

void h(class C)
{
     C(2);
}

即使我们保证 C 有 operator(),这也是没有意义的。您需要一个模板:

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

int main()
{
    g([](int x){return x + 2;});
}

关于c++ - C++0x 的 lambda 表达式没有命名类型是不是很糟糕?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1494109/

相关文章:

c++ - 错误: No Matching function to call to 'online'

c++ - 有人可以向我解释此C++代码(属于链表程序)吗?

java - 简洁流语法 - 处理用户输入

c++ - 清除共享指针 vector 后内存泄漏

c++ - GetFileSizeEx 损坏文件句柄

c++ - 正则表达式与 C++ 不匹配

java - 逻辑运算后排序的 Lambda 表达式

c++ - const static auto lambda 与引用捕获一起使用

c++ - C++11 是否要求分配器是默认可构造的,libstdc++ 和 libc++ 不同意?

c++ - 重载小于 (<) 运算符,用于以多种方式对对象进行排序