: lambda是C++11新加入的闭包语法, 一个lambda对象的实际类型我们一般写不出来, 如果想要在后面使用lambda对象的话常常需要用到decltype, 且lambda本身也常常用到decltype...最基础的lambda展开后形如下面的样子:
// 如果我们写出下面的lambda, 会被展开为下面的形式
[x](int k){ std::cout<<k; };
// 展开的函数对象是匿名的, 其名称由编译器生成...这就是为什么我们不允许改变捕获的变量的值
void operator()(int k) const { std::cout<<k; }
};
复杂点的lambda展开后是下面的样子:
// 这里对..., 只是马上就会被丢弃而已, 如果不加以利用就很浪费, 例如我们在赋值语句使用函数的返回值(右值)需要对对象进行两次构造....尽管这里都是左值, 但是它们的声明类型依然是正确的, 我们想到可以利用转型来恢复它的引用属性
为了适配模板, 我们可以写出如下的模板函数. pass传入ref的参数只有int&和int&&两种类型, 且都是左值