std::variant<Types...>:: swap
|
void
swap
(
variant
&
rhs
)
noexcept
(
/* see below */
)
;
|
(C++17부터)
(C++20부터 constexpr) |
|
두 개의
variant
객체를 교환합니다.
- 만약 * this 와 rhs 모두 예외로 인해 값이 없는 상태라면, 아무 작업도 수행하지 않습니다.
-
그렇지 않고
*
this
와
rhs
가 동일한 alternative를 보유하고 있다면,
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
인 경우가 아니면 형식이 올바르지 않습니다.
목차 |
매개변수
| 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
알고리즘을 특수화함
(함수 템플릿) |