Namespaces
Variants

std::pair<T1,T2>::swap

From ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Утилиты программы
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Реляционные операторы (устарело в C++20)
 
 
void swap( pair& other ) noexcept(/* see below */);
(1) (начиная с C++11)
(constexpr начиная с C++20)
constexpr void swap( const pair& other ) const noexcept(/* see below */);
(2) (начиная с C++23)

Меняет местами first с other.first и second с other.second, как если бы через using std::swap; swap(first, other.first); swap(second, other.second);.

Если любой из выбранных вызовов функции swap является некорректным или не меняет местами значение элемента, поведение не определено.

(до C++23)
1) Программа является некорректной, если либо std::is_swappable_v<T1>, либо std::is_swappable_v<T2> не является true.
2) Программа является некорректной, если либо std::is_swappable_v<const T1>, либо std::is_swappable_v<const T2> не является true.

Если любой из выбранных вызовов функции swap не меняет местами значение элемента, поведение не определено.

(начиная с C++23)

Параметры

other - пара значений для обмена

Исключения

noexcept спецификация:
noexcept (

noexcept ( swap ( first, other. first ) ) &&
noexcept ( swap ( second, other. second ) )

)

В приведённом выше выражении идентификатор swap ищется таким же образом, как это делает признак C++17 std::is_nothrow_swappable .

(до C++17)
1)
noexcept спецификация:
noexcept (

std:: is_nothrow_swappable_v < first_type > &&
std:: is_nothrow_swappable_v < second_type >

)
2)
noexcept спецификация:
noexcept (

std:: is_nothrow_swappable_v < const first_type > &&
std:: is_nothrow_swappable_v < const second_type >

)
(начиная с C++17)

Пример

#include <iostream>
#include <utility>
#include <string>
int main()
{
    std::pair<int, std::string> p1(10, "test"), p2;
    p2.swap(p1);
    std::cout << "(" << p2.first << ", " << p2.second << ")\n";
#if __cpp_lib_ranges_zip >= 202110L
    // Использование перегруженной версии swap с квалификатором const из C++23
    // (swap больше не распространяет константность пары)
    int i1 = 10, i2{};
    std::string s1("test"), s2;
    const std::pair<int&, std::string&> r1(i1, s1), r2(i2, s2);
    r2.swap(r1);
    std::cout << "(" << i2 << ", " << s2 << ")\n";
#endif
}

Возможный вывод:

(10, test)
(10, test)

Сообщения о дефектах

Следующие сообщения о дефектах, изменяющих поведение, были применены ретроспективно к ранее опубликованным стандартам C++.

DR Применён к Поведение в опубликованном виде Скорректированное поведение
LWG 2456 C++11 спецификация noexcept является некорректной сделано работоспособным

Смотрите также

обменивает значения двух объектов
(шаблон функции)
обменивает содержимое двух tuple
(публичная функция-член std::tuple<Types...> )