std::variant<Types...>::swap
void swap( variant& rhs ) noexcept(/* see below */);
|
(C++17부터) (C++20부터 constexpr) |
|
두 개의 variant 객체를 교환합니다.
- 만약
*this과rhs이 모두 예외로 인해 값이 없는 상태(valueless by exception)이면, 아무것도 하지 않습니다. - 그렇지 않고,
*this과rhs이 동일한 대안(alternative)을 가지고 있다면,swap(*std::get_if<i>(this), *std::get_if<i>(std::addressof(rhs)))를 호출합니다. 여기서i는index()입니다. 예외가 발생하면, 값들의 상태는 호출된swap함수의 예외 안전성에 따라 달라집니다. - 그 외의 경우,
rhs과*this의 값을 교환합니다. 예외가 발생하면,*this과rhs의 상태는 variant의 이동 생성자의 예외 안전성에 따라 달라집니다.
프로그램의 형식이 잘못되었습니다(ill-formed), 만약 타입 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
)
)
)
에서 발생할 수 있는 모든 예외를 throw할 수 있습니다. 여기서
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 | 적용 대상 | 게시된 동작 | 올바른 동작 |
|---|---|---|---|
| P2231R1 | C++20 |
swap
함수가
constexpr
가 아니었으나 C++20에서 비트리비얼 소멸자들이
constexpr
가 될 수 있음
|
constexpr 로 변경됨 |
참고 항목
|
(C++17)
|
std::swap
알고리즘을 특수화함
(함수 템플릿) |