Namespaces
Variants

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

From ko.cppreference.net
 
 
유틸리티 라이브러리
일반 유틸리티
관계 연산자 (C++20에서 폐기됨)
정수 비교 함수
(C++20)(C++20)(C++20)    
(C++20)
Swap 및 타입 연산
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
일반 용어 타입
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



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

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 알고리즘을 특수화함
(함수 템플릿)