Namespaces
Variants

std::variant<Types...>:: swap

From cppreference.net
Utilities library
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 가 보유한 대안들의 이동 생성자에 의해 발생된 모든 예외를 던질 수 있습니다.

noexcept 명세:
noexcept ( ( ( std:: is_nothrow_move_constructible_v < Types > &&
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 로 변경됨

참고 항목

std::swap 알고리즘을 특수화함
(함수 템플릿)