Spec-Zone.ru › C++

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

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 ищется так же, как идентификатор, используемый в трейте std::is_nothrow_swappable из C++17.

(до 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 <string>
#include <utility>

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/cpp/utility/pair/swap

Spec-Zone.ru

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