Пространства имён
Варианты
Действия

std::pair::swap

Материал из cppreference.com
< cpp‎ | utility‎ | pair
 
 
Библиотека утилит
Языковая поддержка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования функциональности библиотеки (C++20)    
Управление динамической памятью
Программные утилиты
Поддержка сопрограмм(C++20)
Вариативные функции
Трёхстороннее сравнение (C++20)
(C++20)
(C++20)(C++20)(C++20)(C++20)(C++20)(C++20)
Общие утилиты
Дата и время
Функциональные объекты
Библиотека форматирования(C++20)
(C++11)
Операторы отношения (устарело в C++20)
Целочисленные функции сравнения
(C++20)(C++20)(C++20)    
(C++20)
Операции обмена и типа
(C++11)
(C++11)
(C++17)
Общие лексические типы
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)
Элементарные преобразования строк
(C++17)
(C++17)
 
std::pair
Функции-элементы
pair::swap
(C++11)
Функции, не являющиеся элементами
(до C++20)(до C++20)(до C++20)(до C++20)(до C++20)(C++20)
(C++11)
(C++11)
Правила вывода(C++17)
Вспомогательные классы
(C++11)
 
(1)
void swap( pair& other )noexcept(/* смотрите ниже */);
(начиная с C++11)
(до C++20)
constexprvoid swap( pair& other )noexcept(/* смотрите ниже */);
(начиная с C++20)
constexprvoid swap(const pair& other )constnoexcept(/* смотрите ниже */);
(2) (начиная с C++23)

Заменяет first на other.first и second на other.second, как если бы usingstd::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 pair значений для обмена

[править]Возвращаемое значение

(нет)

[править]Исключения

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

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

(10, тест) (10, тест)

[править]Отчёты о дефектах

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

Номер Применён Поведение в стандарте Корректное поведение
LWG 2456 C++11 спецификация noexcept некорректна сделана работающей

[править]Смотрите также

меняет местами значения двух объектов
(шаблон функции)[править]
меняет местами содержимое двух tuple
(public функция-элемент std::tuple)[править]
close