Различия между ссылками RValue и ссылками экспедиторской было сделано достаточно ясно, в этом примере Скотт Мейерс:Это ссылка для пересылки?
Widget&& var1 = someWidget; // here, “&&” means rvalue reference (1)
auto&& var2 = var1; // here, “&&” does not mean rvalue reference (2)
template<typename T>
void f(std::vector<T>&& param); // here, “&&” means rvalue reference (3)
template<typename T>
void f(T&& param); // here, “&&”does not mean rvalue reference (4)
По существу различие происходит, когда мы имеем выводимые контекст, следовательно, случай (3) четко указано, что мы имеют vector<...>&&
, тогда как T
в случае (4) должен быть выведен и (после применения правил сворачивания ссылок), классифицированных в терминах «категория стоимости».
Но что происходит с более сложным сопоставлением шаблонов? Рассмотрим следующий случай, например:
template <template <class...> class Tuple, class... Ts>
void f(Tuple<Ts...>&& arg)
{
}
Что &&
значит здесь?
Выделенный контекст не имеет значения. (3) и (4) являются выводимыми. – Oktalist