std::variant<Types...>:: swap
|
void
swap
(
variant
&
rhs
)
noexcept
(
/* см. ниже */
)
;
|
(начиная с C++17)
(constexpr начиная с 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
(шаблон функции) |