Что выведет код Senior Move-семантика обновлено
Что выведет: forwarding и перегрузка по категории
Вопрос
Что выведет программа (C++20, g++ 14)? Каждый вывод с новой строки, как в консоли.
#include <iostream>
#include <utility>
void f(int&) { std::cout << "lvalue\n"; }
void f(int&&) { std::cout << "rvalue\n"; }
template <class T>
void g(T&& x) {
f(x);
f(std::forward<T>(x));
}
int main() {
int a = 1;
g(a);
g(2);
int&& r = 3;
f(r);
}
Попробуйте сами
Напишите, что выведет код: каждый вывод с новой строки.
Показать ответ и разбор
Коротко
Код выведет: lvalue, lvalue, lvalue, rvalue, lvalue. В g(a) T = int&: и x, и std::forward<int&(x) lvalue.
Что выведет
lvalue
lvalue
lvalue
rvalue
lvalue
Разбор
В g(a) T = int&: и x, и std::forward<int&>(x) lvalue. В g(2) T = int: x как имя lvalue, а std::forward<int>(x) rvalue. f(r): именованная rvalue-ссылка является lvalue.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.
Ещё по теме «Move-семантика»
- Перенос между складами: map::extract без копий
- Топ участников: сортировка записей без копий строк
- lvalue, prvalue, xvalue
- std::move от const-объекта
- push_back и emplace_back
- std::exchange в перемещении
- Объясни move-семантику
- Допишите обёртку с perfect forwarding