20    Pair(
const T1& t_1, 
const T2& t_2) : first(t_1), second(t_2) {}
 
   21    Pair(T1&& t_1, T2&& t_2) : first(std::move(t_1)), second(std::move(t_2)) {}
 
   22    Pair(
const T1& t_1, T2&& t_2) : first(t_1), second(std::move(t_2)) {}
 
   23    Pair(T1&& t_1, 
const T2& t_2) : first(std::move(t_1)), second(t_2) {}
 
   28    Pair& operator=(
const Pair&) = 
default;
 
   31    bool operator==(
const Pair& t_rhs)
 const {
 
   32        return std::equal_to<T1>()(first, t_rhs.first) && std::equal_to<T2>()(second, t_rhs.second);
 
 
   38    CommutativePair(
const T& t_1, 
const T& t_2) : 
Pair<T, T>(CompareT()(t_1, t_2) ? t_1 : t_2, CompareT()(t_1, t_2) ? t_2 : t_1) {}
 
   39    CommutativePair(T&& t_1, T&& t_2) : 
Pair<T, T>(CompareT()(t_1, t_2) ? std::move(t_1) : std::move(t_2), CompareT()(t_1, t_2) ? std::move(t_2) : std::move(t_1)) {}
 
   40    CommutativePair(
const T& t_1, T&& t_2) : 
Pair<T, T>(CompareT()(t_1, t_2) ? t_1 : std::move(t_2), CompareT()(t_1, t_2) ? std::move(t_2) : t_1) {}
 
   41    CommutativePair(T&& t_1, 
const T& t_2) : 
Pair<T, T>(CompareT()(t_1, t_2) ? std::move(t_1) : t_2, CompareT()(t_1, t_2) ? t_2 : std::move(t_1)) {}
 
   50        return std::equal_to<T>()(this->first, t_rhs.first) && std::equal_to<T>()(this->second, t_rhs.second);