Функция std:: minmax, введенная в С++ 11, должна возвращать пару, соответственно, самую низкую и наибольшую из данных значения.
В этом примере:
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;
Это работает так, как рекламируется и печатает
p.first = 5
p.second = 6
Теперь я хотел бы эффективно изменить a
и b
, чтобы заставить b быть ниже, как если бы он выполнял этот код:
if (b > a)
std::swap(a, b);
Итак, я написал это:
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;
Однако это печатает:
a = 5
b = 5
Вместо этого используйте перегрузку initializer_list, например:
std::tie(b, a) = std::minmax({a, b});
вызывает вывод ожидаемого результата:
a = 6
b = 5
Компилятор GCC 4.7.1 (также протестирован с GCC 4.8.1 на Linux и Windows с Mingw-w64). Я создал SSCCE в http://ideone.com/fA0qw5.
Почему перегрузка двух аргументов не делает то, что она должна делать при использовании std::tie
?