std:: swap
|
Определено в заголовочном файле
<algorithm>
|
(до C++11)
|
|
|
Определено в заголовочном файле
<utility>
|
(начиная с C++11)
|
|
|
Определено в заголовочном файле
<string_view>
|
||
|
template
<
class
T
>
void swap ( T & a, T & b ) ; |
(1) |
(условно noexcept начиная с C++11)
(constexpr начиная с C++20) |
|
template
<
class
T2,
std::
size_t
N
>
void swap ( T2 ( & a ) [ N ] , T2 ( & b ) [ N ] ) ; |
(2) |
(условно noexcept начиная с C++11)
(constexpr начиная с C++20) |
Обменивает заданные значения.
|
Эта перегрузка участвует в разрешении перегрузки только если std:: is_move_constructible_v < T > && std:: is_move_assignable_v < T > равно true . |
(since C++17) |
|
Эта перегрузка участвует в разрешении перегрузки только если std:: is_swappable_v < T2 > равно true . |
(since C++17) |
Содержание |
Параметры
| a, b | - | значения для обмена |
| Требования к типам | ||
-
T
должен удовлетворять требованиям
CopyConstructible
и
CopyAssignable
(до C++11)
MoveConstructible
и
MoveAssignable
(начиная с C++11)
.
|
||
-
T2
должен удовлетворять требованиям
Swappable
.
|
||
Возвращаемое значение
(нет)
Исключения
|
(нет) |
(до C++11) |
|
noexcept
спецификация:
noexcept
(
std::
is_nothrow_move_constructible
<
T
>
::
value
&&
|
(начиная с C++11) |
|
noexcept
спецификация:
Поиск идентификатора
noexcept
(
noexcept
(
swap
(
*
a,
*
b
)
)
)
swap
в спецификации исключений находит этот шаблон функции в дополнение к тому, что найдено обычными правилами поиска, делая спецификацию исключений эквивалентной C++17
std::is_nothrow_swappable
.
|
(начиная с C++11)
(до C++17) |
|
noexcept
спецификация:
noexcept
(
std::
is_nothrow_swappable_v
<
T2
>
)
|
(начиная с C++17) |
Сложность
Специализации
|
|
(до C++20) |
Ожидаемый способ сделать програмно-определяемый тип заменяемым — предоставить нечленную функцию swap в том же пространстве имен, что и тип: подробности смотрите в Swappable .
Следующие перегрузки уже предоставлены стандартной библиотекой:
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++20)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++23)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(функция) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++14)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++11)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++17)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
(C++17)
|
специализирует алгоритм
std::swap
(функция) |
|
(C++17)
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
специализирует алгоритм
std::swap
(шаблон функции) |
|
|
(C++17)
|
специализирует алгоритм
std::swap
(функция) |
|
(C++23)
|
специализирует алгоритм
std::swap
(функция) |
|
(C++20)
|
специализирует алгоритм
std::swap
(функция) |
|
(C++23)
|
специализирует алгоритм
std::swap
(функция) |
|
(C++20)
|
специализирует алгоритм
std::swap
(функция) |
|
(C++20)
|
специализирует алгоритм
std::swap
(функция) |
Пример
#include <algorithm> #include <iostream> namespace Ns { class A { int id {}; friend void swap(A& lhs, A& rhs) { std::cout << "swap(" << lhs << ", " << rhs << ")\n"; std::swap(lhs.id, rhs.id); } friend std::ostream& operator<<(std::ostream& os, A const& a) { return os << "A::id=" << a.id; } public: A(int i) : id {i} {} A(A const&) = delete; A& operator = (A const&) = delete; }; } int main() { int a = 5, b = 3; std::cout << a << ' ' << b << '\n'; std::swap(a, b); std::cout << a << ' ' << b << '\n'; Ns::A p {6}, q {9}; std::cout << p << ' ' << q << '\n'; // std::swap(p, q); // ошибка, требования к типу не выполнены swap(p, q); // OK, ADL находит подходящую friend-функцию `swap` std::cout << p << ' ' << q << '\n'; }
Вывод:
5 3 3 5 A::id=6 A::id=9 swap(A::id=6, A::id=9) A::id=9 A::id=6
Отчеты о дефектах
Следующие отчеты об изменениях в поведении, содержащие описания дефектов, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение в опубликованной версии | Корректное поведение |
|---|---|---|---|
| LWG 227 | C++98 |
T
не требовалось быть
CopyConstructible
или
DefaultConstructible
(временный объект типа
T
мог быть неконструируемым)
|
T
также требуется
быть CopyConstructible |
| LWG 809 | C++98 | массивы не могли быть обменены | добавлена перегрузка (2) |
| LWG 2554 | C++11 |
обмен многомерными массивами никогда не может
быть noexcept из-за проблем поиска имени |
исправлено для работы |
Смотрите также
|
(C++20)
|
обменивает значения двух объектов
(объект точки настройки) |
|
обменивает элементы, на которые указывают два итератора
(шаблон функции) |
|
|
обменивает два диапазона элементов
(шаблон функции) |
|
|
(C++14)
|
заменяет аргумент новым значением и возвращает его предыдущее значение
(шаблон функции) |