Выбор ответа Middle Move-семантика спрашивают часто обновлено
Что такое T&& в шаблоне
Вопрос
Что означает параметр T&& x в template <class T> void f(T&& x);?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Forwarding-ссылка: принимает и lvalue (T = U&), и rvalue. Когда T выводится в этом же вызове, T&& становится forwarding-ссылкой.
Варианты ответа
- rvalue-ссылка: lvalue передать нельзя, нужен
std::move - Ссылка на ссылку:
xссылается на ссылку вызывающего - Константная ссылка, которую компилятор продлевает для временных
- 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 ошибок.
Ещё по теме «Move-семантика»
- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- lvalue, prvalue, xvalue
- std::move от const-объекта
- push_back и emplace_back
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding