通用 lambda 的熟悉模板语法

Posted

技术标签:

【中文标题】通用 lambda 的熟悉模板语法【英文标题】:Familiar template syntax for generic lambdas 【发布时间】:2018-11-15 17:09:59 【问题描述】:

对于 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("你好");

【问题讨论】:

请注意,此功能的部分重点是允许约束 exant(由此推断)模板参数。 【参考方案1】:

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

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

相当于这个:

struct unnamed

  template<typename T>
  void operator()(T t) 
;

auto f = unnamed;

如果您想为 lambda 函数显式提供模板参数,则必须显式调用 operator()f.operator()&lt;template arguments&gt;(parameters);

【讨论】:

以上是关于通用 lambda 的熟悉模板语法的主要内容,如果未能解决你的问题,请参考以下文章

何时使用函数模板而不是通用 lambda?

显式指定通用 lambda 的 operator() 模板参数是不是合法?

是否(或将会)在 lambda 表达式中使用熟悉的模板语法?

如何创建一个可变的通用lambda?

如何编写一个丢弃其参数的通用可变参数 lambda?

从通用 lambda 调用 `this` 成员函数 - clang vs gcc