標準アルゴリズムmin
とmax
は、単一の値と比較することができます。しかし、minmax
アルゴリズムの戻り値は、値の組と比較することができない。std :: 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)
戻りpair<int, int>
とminmax(1, 2)
がpair<const int&, const int&>
を返すことです。参照先はありません。pair
の場合は、operator==
のオーバーロードが混在しています。
この修正は、std::pair<const int&, const int&>(int, int)
を明示的に書き込むか、またはこれを自家製のmake_cref_pair
関数でラップすることです。
質問:値のpair
に対するminmax
戻り値を比較するためのクリーンな方法は何ですか?そして私はmake_cref_pair
の参照を正しく処理しましたか?
私は 'make_cref_pair'は合法ではないかもしれないことを恐れる(寿命延長が私の知る限り、サブオブジェクトには適用されません) – sehe
@セクシーな男。同じことが、裸の 'pair(1,2)'にも適用されますか? –
TemplateRex
それは同じでしょう。私はこれについて本当に確信していませんが、それは端に遊んでいるように思えます – sehe