考虑:
struct Foo {
std::vector<int> data () const { return vec; }
const std::vector<int>& c_data () const { return vec; }
std::vector<int> vec {};
};
auto lambda1 = [] (const std::vector<int>&) {};
auto lambda2 = [] (std::vector<int>&&) {};
auto lambda3 = [] (const auto&) {};
auto lambda4 = [] (auto&& p) {};
用法是:
Foo f {};
lambda1 (f.data ());
lambda1 (f.c_data ());
lambda2 (f.data ());
lambda2 (f.c_data ()); // (X)
lambda3 (f.data ());
lambda3 (f.c_data ());
lambda4 (f.data ());
lambda4 (f.c_data ()); // (Y)
这段代码因为 (X) 而编译失败,这当然是我可以理解的。我们不能将 const 引用绑定到右值引用。美好的。
有人可以解释一下lambda4
'sp
参数的实际类型是什么吗?在这里(Y),即使我将 const 引用参数传递给它,编译器也会编译它。
类型推导意义上的lambda2
和类型有什么区别?lambda4