Что выведет код 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 ошибок.