В стандарте С++ 14 указано следующее объявление для std::exchange:
template <class T, class U = T>
T std::exchange(T& obj, U&& new_value);
Мне интересно, почему U по умолчанию имеет значение T, так как U можно найти благодаря new_value. В каком случае это приведет к другому результату, чем:
template <class T, class U>
T std::exchange(T& obj, U&& new_value);