【发布时间】:2016-03-17 16:16:41
【问题描述】:
考虑:
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 的p 参数的实际类型是什么?这里 (Y),即使我将 const 引用参数传递给它,编译器也会编译它。
lambda2 和lambda4 类型在类型推导意义上的区别是什么?
【问题讨论】:
-
auto&& p是转发引用。它可以绑定到左值和右值。
标签: c++ c++14 type-deduction generic-lambda