標準アルゴリズムで、単一の値min
とmax
比較できます。ただし、minmax
アルゴリズムの戻り値を値のペアと比較することはできません。
#include <algorithm>
#include <utility>
template<class T1, class T2>
constexpr auto make_cref_pair(T1&& t1, T2&& t2)
{
return std::pair<T1 const&, T2 const&>(std::forward<T1>(t1), std::forward<T2>(t2));
}
int main()
{
static_assert(std::min(2, 1) == 1); // OK
static_assert(std::max(2, 1) == 2); // OK
//static_assert(std::minmax(2, 1) == std::make_pair(1, 2)); // ERROR, const int& vs int pair comparison
static_assert(std::minmax(2, 1) == std::pair<const int&, const int&>(1, 2)); // OK
static_assert(std::minmax(2, 1) == make_cref_pair(1, 2)); // OK
}
その理由は、make_pair(2, 1)
が a を返し、 apair<int, int>
をminmax(1, 2)
返すためpair<const int&, const int&>
です。の参照混合operator==
オーバーロードはありませんpair
。
修正は、明示的に記述するstd::pair<const int&, const int&>(int, int)
か、これを自家製のmake_cref_pair
関数でラップすることです。
質問minmax
:戻り値を値の aと比較するよりクリーンな方法はありpair
ますか? で参照を正しく処理しましたmake_cref_pair
か?