Предположим, что я хочу, чтобы swap
работал на rvalues и не хотел писать 4 версии для всех комбинаций ссылок rvalue/lvalue (версия rvalue/rvalue является беспредметной, но это не повредит). Я придумал это:
template <typename A, typename B>
struct is_same_no_ref
: std::is_same<
typename std::remove_reference<A>::type,
typename std::remove_reference<B>::type
>
{};
template <typename A, typename B,
typename = typename std::enable_if<is_same_no_ref<A, B>::value>::type
>
inline void my_swap(A&& a, B&& b) {
typename std::remove_reference<A>::type t = std::move(a);
a = std::move(b);
b = std::move(t);
}
который работает как ожидалось. Это нормально? Или я упускаю что-то важное, что заставит меня страдать позже?