Узнав о std::exchange
на cppreference.com , я наткнулся на его «возможную реализацию», которая приведена ниже.
template<class T, class U = T>
T exchange(T& obj, U&& new_value)
{
T old_value = std::move(obj);
obj = std::forward<U>(new_value);
return old_value;
}
Было немного странно видеть obj = std::forward
в операторе присваивания вместо std::move
, что, я думаю, будет иметь тот же эффект.
Насколько я понимаю, std::move
эквивалентен static_cast
типу ссылки rvalue (но более выразителен) и всегда возвращает значение xvalue, тогда как std::forward
возвращает тот же тип значения, которому оно было передано.
Мой вопрос: почему std:forward
используется в приведенном выше фрагменте?и есть ли простое правило, чтобы решить, когда это лучший выбор?