通用lambda的熟悉模板语法

时间:2018-06-06 06:06:25

标签: c++ lambda language-lawyer c++20

对于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:错误:在'&gt;'之前预期的primary-expression代币            F( “你好”);

1 个答案:

答案 0 :(得分:7)

lambda表达式的结果不是函数;它是一个函数 object 。也就是说,它是一种具有operator()重载的类类型。所以这个:

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

等同于:

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

auto f = unnamed{};

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