std::variant<Types...>::swap
void swap( variant& rhs ) noexcept(/* see below */);
|
(since C++17) (constexpr since C++20) |
|
Обменивает два объекта variant .
- Если оба
*thisиrhsне содержат значения по причине исключения, ничего не делает. - В противном случае, если оба
*thisиrhsсодержат одну и ту же альтернативу, вызываетswap(*std::get_if<i>(this), *std::get_if<i>(std::addressof(rhs))), гдеi— этоindex(). Если выбрасывается исключение, состояние значений зависит от гарантии безопасности исключений вызванной функцииswap. - В противном случае обменивает значения
rhsи*this. Если выбрасывается исключение, состояние*thisиrhsзависит от гарантии безопасности исключений конструктора перемещения variant.
Программа считается некорректной, если тип T_i не является Swappable , а std::is_move_constructible_v<T_i> не является true для всех T_i из Types... .
Параметры
| rhs | - |
объект типа
variant
для обмена
|
Возвращаемое значение
(нет)
Исключения
Если
this
-
>
index
(
)
==
rhs.
index
(
)
, может выбросить любое исключение, выбрасываемое
swap
(
*
std::
get_if
<
i
>
(
this
)
,
*
std::
get_if
<
i
>
(
std::
addressof
(
rhs
)
)
)
при
i
равном
index()
.
В противном случае может выбросить любое исключение, выбрасываемое конструкторами перемещения альтернатив, которые в данный момент содержатся в * this и rhs .
std:: is_nothrow_swappable_v < Types > ) && ... ) )
Примечания
| Макрос тестирования возможностей | Значение | Стандарт | Функция |
|---|---|---|---|
__cpp_lib_variant
|
202106L
|
(C++20)
(DR) |
Полностью
constexpr
std::variant
|
Пример
#include <iostream> #include <string> #include <variant> int main() { std::variant<int, std::string> v1{2}, v2{"abc"}; std::visit([](auto&& x) { std::cout << x << ' '; }, v1); std::visit([](auto&& x) { std::cout << x << '\n'; }, v2); v1.swap(v2); std::visit([](auto&& x) { std::cout << x << ' '; }, v1); std::visit([](auto&& x) { std::cout << x << '\n'; }, v2); }
Вывод:
2 abc abc 2
Отчеты о дефектах
Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| P2231R1 | C++20 |
swap
не был
constexpr
в то время как нетривиальные деструкторы могут быть
constexpr
в C++20
|
сделан constexpr |
Смотрите также
|
(C++17)
|
специализирует алгоритм
std::swap
(шаблон функции) |