通用C ++ 14 lambda和与模板的关系

时间:2016-05-02 16:56:51

标签: c++ lambda c++14

我确实读过带有auto参数的C ++ 14泛型lambdas实际上是模板,所以以下是有效的C ++ 14

auto glambda = [] (auto a) { return a; };
cout << glambda(23); // Prints 23
cout << glambda('A'); // Prints A

这与我从模板中知道的内容并不完全相符..实例化点在哪里?如果第一个调用使用glambda实例化模板而第二个调用使用int实例化模板,那么它存储在char变量中的内容是什么?

2 个答案:

答案 0 :(得分:8)

不是“lambda是模板” - 这没有意义,lambda是一个表达式。相反,由lambda表达式定义的闭包对象的 type 具有由成员函数模板定义的重载函数调用运算符。因此,实例化点是第一次使用相应的调用操作符。

换句话说,lambda [a, &b](auto x, auto y) -> R { /* ... */ }的类型如下:

struct __lambda
{
    __lambda(const A & __a, B & __b) : a(__a), b(__b) {}

    template <typename T1, typename T2>
    R operator()(T1 x, T2 y) const { /* ... */ }

private:
    A a;
    B & b;
};

答案 1 :(得分:4)

泛型lambda是编译器生成类型的对象,其具有名为operator()的模板方法。您可以使用以下等效代码重写代码:

struct MyLambda {
    template<typename T>
    T operator() (T val) {
        return val;
    }
};

int main() {
    MyLambda func;

    std::cout << func('A');
    std::cout << func(42);
}

编译器将在需要时实例化operator()

希望有所帮助