Подтвердить что ты не робот

Перегрузки std:: minmax() и std:: tie

Функция 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?

4b9b3361

Ответ 1

Проблема заключается в том, что std::minmax возвращает ссылки для версии с двумя аргументами. Таким образом, как только b в std::tie(b, a) назначается, изменение отражается в части b возвращаемого std::pair, указывая ему значение 5 - которое, в свою очередь, назначается a в std::tie(b, a), в результате получим (5, 5).