我确实读过带auto参数的C++ 14泛型lambdas 实际上是模板,所以以下是有效的C++ 14
auto glambda = [] (auto a) { return a; };
cout << glambda(23); // Prints 23
cout << glambda('A'); // Prints A
Run Code Online (Sandbox Code Playgroud)
这与我从模板中知道的内容并不完全相符..实例化点在哪里?glambda如果第一个调用实例化模板,int第二个调用实例化模板,它存储在变量中的是什么char?
并不是说"lambda是模板" - 这没有意义,lambda是一个表达式.相反,由lambda表达式定义的闭包对象的类型具有由成员函数模板定义的重载函数调用运算符.因此,实例化点是相应调用操作符的第一次使用.
换句话说,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;
};
Run Code Online (Sandbox Code Playgroud)