Gli algoritmi standard min
e max
possono essere confrontati con un singolo valore. Tuttavia, il valore restituito minmax
algoritmo non può essere confrontata con una coppia di valori:Confronto di std :: minmax in coppia
#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
}
La ragione è che make_pair(2, 1)
restituisce un pair<int, int>
e minmax(1, 2)
restituisce un pair<const int&, const int&>
. Non ci sono riferimenti - sovraccarico operator==
per pair
.
La correzione è quindi di scrivere esplicitamente std::pair<const int&, const int&>(int, int)
o di avvolgere questo in una funzione fatta in casa make_cref_pair
.
Domande: c'è un modo più pulito per confrontare il valore minmax
di ritorno contro un pair
di valori? E ho gestito correttamente i riferimenti nel mio make_cref_pair
?
temo che 'make_cref_pair' potrebbe non essere legale (prolungamento tempo di vita non si applica agli oggetti secondari, per quanto ne so) – sehe
@sei yikes. Lo stesso vale per la coppia nuda (1,2) '? –
TemplateRex
Sarebbe lo stesso. Non ne sono veramente sicuro, ma sembra che ci sia un limite al limite – sehe