Ваша проблема связана с типом возврата forward
. Вы используете auto
в качестве типа возврата, который не выведет для вас ссылку. Это означает, что когда вы возвращаетесь, независимо от того, из какой ветви он возвращается, вы возвращаетесь по значению, что означает, что у вас есть значение.
Вам нужно decltype(auto)
, чтобы вы возвращали ссылку на rvalue или lvalue, в зависимости от оператора return. Использование
template <class T> decltype(auto) forward(T &&t) {
if constexpr (std::is_lvalue_reference<T>::value)
return t;
else
return std::move(t);
}
дает вам вывод:
rvalue
lvalue