types_is_swappable

types_is_swappable (스와퍼블 타입 판별)

이 페이지에서는 C++17부터 제공되는 <type_traits> 헤더의 is_swappable 계열 타입 특성(trait)을 다뤄요. 이 특성들은 주어진 타입들이 swap 표현식으로 교환 가능한지, 그리고 그 과정에서 예외가 발생하지 않는지를 컴파일 타임에 판별해 줍니다. 특히 std::swap과 같은 일반화된 교환 동작을 조건부로 활성화할 때 유용하게 사용할 수 있어요.

출처: cppreference

본문

정의

<type_traits> 헤더에 다음과 같은 네 가지 클래스 템플릿이 정의되어 있어요.

template < class T , class U > struct is_swappable_with ;        // (1) since C++17
template < class T > struct is_swappable ;                       // (2) since C++17
template < class T , class U > struct is_nothrow_swappable_with ; // (3) since C++17
template < class T > struct is_nothrow_swappable ;                // (4) since C++17
  • (1)은 TU 타입의 객체가 서로 교환 가능한지 검사해요.
  • (2)는 T 타입의 객체가 자기 자신과 교환 가능한지, 즉 std::is_swappable_with<T, T>와 동일한 의미를 가져요.
  • (3)은 TU의 교환이 예외를 던지지 않는지 검사해요.
  • (4)는 T 타입의 자기 교환이 예외를 던지지 않는지 검사해요.

만약 T 또는 U가 완전한 타입(complete type)이 아니거나, cv 한정된 void, 또는 경계를 알 수 없는 배열이라면 동작이 정의되지 않아요. 또한 이 템플릿의 인스턴스화가 불완전한 타입에 직간접적으로 의존하고, 그 타입이 가상으로 완성되었을 때 결과가 달라질 수 있다면 동작이 정의되지 않아요. 이 페이지에 설명된 템플릿에 대해 프로그램이 특수화를 추가하는 경우에도 동작이 정의되지 않아요.

헬퍼 변수 템플릿

각 클래스 템플릿에 대응하는 _v 접미사 변수 템플릿도 제공돼요.

template < class T , class U > constexpr bool is_swappable_with_v = is_swappable_with < T , U >:: value ;        // since C++17
template < class T > constexpr bool is_swappable_v = is_swappable < T >:: value ;                               // since C++17
template < class T , class U > constexpr bool is_nothrow_swappable_with_v = is_nothrow_swappable_with < T , U >:: value ; // since C++17
template < class T > constexpr bool is_nothrow_swappable_v = is_nothrow_swappable < T >:: value ;              // since C++17

std::integral_constant에서 상속

이 특성들은 std::integral_constant<bool, value>를 상속받아요. 따라서 다음과 같은 멤버들을 사용할 수 있어요.

멤버 상수

이름 설명
value TU와 교환 가능하면 true, 아니면 false (정적 멤버 상수)

멤버 함수

이름 설명
operator bool 객체를 bool로 변환하며 value를 반환해요
operator() (C++14) value를 반환해요

멤버 타입

타입 정의
value_type bool
type std::integral_constant<bool, value>

참고 사항

이 특성은 swap 표현식의 직접적인 문맥(immediate context) 밖의 요소는 검사하지 않아요. 예를 들어 TU의 사용이 템플릿 특수화나 암시적으로 정의된 특수 멤버 함수의 생성을 유발하고, 그 과정에서 오류가 발생한다면 실제 swap은 컴파일되지 않을 수 있어요. 이 경우 std::is_swappable_with<T, U>::value가 컴파일되고 true로 평가되더라도 실제 교환 코드는 실패할 수 있다는 점을 주의해야 해요.

예제

이 섹션은 아직 작성되지 않았어요. (Reason: no example)

같이 보기

항목 설명
swap 두 객체의 값을 교환하는 함수 템플릿 [edit]
iter_swap 두 반복자가 가리키는 요소를 교환하는 함수 템플릿 [edit]
ranges::iter_swap (C++20) 역참조 가능한 두 객체가 참조하는 값을 교환하는 커스터마이제이션 포인트 객체 [edit]
is_move_assignable, is_trivially_move_assignable, is_nothrow_move_assignable (C++11) 타입에 이동 대입 연산자가 있는지 검사하는 클래스 템플릿 [edit]
swappable, swappable_with (C++20) 한 타입이 교환 가능하거나 두 타입이 서로 교환 가능함을 지정하는 개념(concept) [edit]
indirectly_swappable (C++20) indirectly_readable 타입이 참조하는 값들을 교환할 수 있음을 지정하는 개념 [edit]
is_swappable_with_type, is_swappable_type, is_nothrow_swappable_with_type, is_nothrow_swappable_type (C++26) 반영된 한 타입의 객체가 다른 반영된 타입의 객체와 교환될 수 있는지 검사하는 함수 [edit]

더 알아보기 (Learn more)

cppreference