11

標準アルゴリズムで、単一の値minmax比較できます。ただし、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か?

4

3 に答える 3