【问题标题】:Familiar template syntax for generic lambdas通用 lambda 的熟悉模板语法
【发布时间】: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(由此推断)模板参数。

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


【解决方案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);

【讨论】:

    猜你喜欢
    • 2015-09-20
    • 1970-01-01
    • 2015-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多