Spec-Zone.ru › C++

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

(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
    // Using the C++23 const qualified swap overload
    // (swap is no longer propagating pair constness)
    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 некорректна исправлено

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/utility/pair/swap

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API