Namespaces
Variants

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

From cppreference.net
Utilities library
(1)
void swap ( pair & other ) noexcept ( /* see below */ ) ;
(начиная с C++11)
(до C++20)
constexpr void swap ( pair & other ) noexcept ( /* see below */ ) ;
(начиная с 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...> )