c++ - min_element - Sobrecargas de std:: minmax() y std:: tie
min c++ (1)
La función std::minmax introducida en C ++ 11 se supone que devuelve un par de los valores más bajos y más altos respectivamente.
En este ejemplo:
int a = 6, b = 5;
auto p = std::minmax(a, b);
std::cout << "p.first = " << p.first << std::endl;
std::cout << "p.second = " << p.second << std::endl;
Esto funciona como se anuncia y se imprime.
p.first = 5
p.second = 6
Ahora me gustaría modificar efectivamente a
y b
para forzar a b a ser más bajo que a, como si estuviera ejecutando este código:
if (b > a)
std::swap(a, b);
Así que he escrito esto:
int a = 5, b = 6;
std::tie(b, a) = std::minmax(a, b);
std::cout << "a = " << a << std::endl;
std::cout << "b = " << b << std::endl;
Sin embargo, esto imprime:
a = 5
b = 5
Usando la sobrecarga initializer_list en su lugar, como esto:
std::tie(b, a) = std::minmax({a, b});
hace que se imprima el resultado esperado:
a = 6
b = 5
El compilador es GCC 4.7.1 (también probado con GCC 4.8.1 en Linux y Windows con Mingw-w64). He creado un SSCCE en http://ideone.com/fA0qw5 .
¿Por qué la sobrecarga de dos argumentos no hace lo que se supone que debe hacer al usar std::tie
?
El problema es que std::minmax
devuelve referencias para la versión de 2 argumentos. De esa manera, tan pronto como se asigna b
en el std::tie(b, a)
, el cambio se refleja en la parte b
del std::pair
devuelto, dándole el valor de 5
, que a su vez se asigna a la a
en std::tie(b, a)
, dando como resultado (5, 5)
.