通用lambda的编译器推导类型

qdi*_*dii 9 c++ lambda type-deduction c++14

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

std::vector<int> ivec = { 1, 2, 3, 4};
std::vector<std::string> 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";
Run Code Online (Sandbox Code Playgroud)

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

template<class T>
class _lambda
{
  public:
  T operator()(T lhs, T rhs) { return lhs + rhs; }
};
Run Code Online (Sandbox Code Playgroud)

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

bol*_*lov 8

不.它生成这样的东西:

class _lambda {
public:
    template<class T1, class T2>
    auto operator()(T1 lhs, T2 rhs) const { return lhs + rhs; }
};
Run Code Online (Sandbox Code Playgroud)

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


101*_*010 8

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

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

因此,实际生成的是:

class _lambda {
public:
    template<typename T1, typename T2>
    auto operator()(T1 lhs, T2 rhs) const { return lhs + rhs; }
};
Run Code Online (Sandbox Code Playgroud)