当前位置:  开发笔记 > 编程语言 > 正文

通用lambda的编译器推导类型

如何解决《通用lambda的编译器推导类型》经验,为你挑选了2个好方法。

在本文中,提供了以下代码:

std::vector ivec = { 1, 2, 3, 4};
std::vector svec = { "red", "green", "blue" };
auto adder = [](auto op1, auto op2){ return op1 + op2; };
std::cout << "int result : "
          << std::accumulate(ivec.begin(),
                             ivec.end(),
                             0,
                             adder)
          << "\n";
std::cout << "string result : "
          << std::accumulate(svec.begin(),
                             svec.end(),
                             std::string(""),
                             adder)
          << "\n";

如果我理解正确,编译器将生成一个类似这样的内部类:

template
class _lambda
{
  public:
  T operator()(T lhs, T rhs) { return lhs + rhs; }
};

但我不明白的是,在代码的这一部分中,加法器似乎同时有两种类型:_lambda_lambda.这怎么可能?



1> bolov..:

不.它生成这样的东西:

class _lambda {
public:
    template
    auto operator()(T1 lhs, T2 rhs) const { return lhs + rhs; }
};

这门课没有模板化.该operator()是.



2> 101010..:

根据标准5.1.2/p5 Lambda表达式[expr.prim.lambda]:

对于一个普通的λ,闭合类型有一个公共内联函数调用的操作件模板(14.5.2),其模板参数列表由一个发明类型模板参数为拉姆达的参数声明子句中的汽车的每一次出现,按出场顺序.

因此,实际生成的是:

class _lambda {
public:
    template
    auto operator()(T1 lhs, T2 rhs) const { return lhs + rhs; }
};

推荐阅读
yzh148448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有