代码之家  ›  专栏  ›  技术社区  ›  Klaus

常见lambdas模板语法

  •  1
  • Klaus  · 技术社区  · 7 年前

    对于C++ 20,建议为通用lambdas添加以下语法 p0428r2.pdf

    auto f = []<typename T>( T t ) {};
    

    但gcc 8中的当前实现不接受以下实例化:

    f<std::string>("");
    

    这是gcc中的实现缺陷还是缺少语言特性?我知道我们讨论的是一个建议,而不是一个批准的规范。

    完整示例(与模板函数语法比较):

    template <typename T> void n( T t ) { std::cout << t << std::endl; }
    
    auto f = []<typename T>( T t ) { std::cout << t << std::endl; };
    
    int main()
    {
        f<std::string>("Hello");  // error!
        n<std::string>("World");
    }
    

    投诉错误如下:

    main.cpp:25:22:错误:标记“>”之前需要主表达式 f(“你好”);

    1 回复  |  直到 7 年前
        1
  •  7
  •   Nicol Bolas    7 年前

    lambda表达式的结果不是函数;它是函数 对象 . 也就是说,它是具有 operator() 超载了。因此:

    auto f = []<typename T>( T t ) {};
    

    相当于:

    struct unnamed
    {
      template<typename T>
      void operator()(T t) {}
    };
    
    auto f = unnamed{};
    

    如果要显式地为lambda函数提供模板参数,则必须调用 运算符() 明确地: f.operator()<template arguments>(parameters); .

    推荐文章