Выбор ответа Middle Move-семантика спрашивают часто обновлено

Что такое T&& в шаблоне

Вопрос

Что означает параметр T&& x в template <class T> void f(T&& x);?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: Forwarding-ссылка: принимает и lvalue (T = U&), и rvalue. Когда T выводится в этом же вызове, T&& становится forwarding-ссылкой.

Варианты ответа

  1. rvalue-ссылка: lvalue передать нельзя, нужен std::move
  2. Ссылка на ссылку: x ссылается на ссылку вызывающего
  3. Константная ссылка, которую компилятор продлевает для временных
  4. Forwarding-ссылка: принимает и lvalue (T = U&), и rvalueправильный ответ

Разбор

Когда T выводится в этом же вызове, T&& становится forwarding-ссылкой. Для lvalue T = U&, и U& && схлопывается в U&. Для rvalue T = U, параметр U&&.

  • Обычная rvalue-ссылка получается, если тип не выводится: void g(std::string&&) или метод шаблона класса с параметром T&&.
  • Ссылок на ссылки в языке нет, есть только схлопывание при выводе.
  • Константности здесь нет.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.