Рассмотрим:Generic лямбда, тип вычет фактического параметра (авто)
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), что, конечно, понятном мной. Мы не можем привязывать константную ссылку, для ссылки rvalue. Хорошо.
Может ли кто-нибудь объяснить мне, что является фактическим типом параметра lambda4
p
? Здесь (Y) компилятор компилирует его, даже если я передаю ему аргумент const reference.
В чем разница между lambda2
и lambda4
типами в смысле типа вычета?
'auto && p' является ссылкой для пересылки. Он может связываться с lvalues и rvalues. – Michael
См., Например, http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4164.pdf – Michael