types_is_move_assignable

types_is_move_assignable (이동 대입 가능 여부를 판별하는 특성)

이 페이지에서는 C++ 표준 라이브러리의 is_move_assignable, is_trivially_move_assignable, is_nothrow_move_assignable 특성 템플릿에 대해 설명해요. 이 특성들은 주어진 타입이 이동 대입 연산을 지원하는지, 그 연산이 사소한(trivial)지 또는 예외를 던지지 않는지 컴파일 타임에 검사해 줘요.

출처: cppreference

본문

정의

<type_traits> 헤더에 정의됨
template < class T > struct is_move_assignable ; (1) (C++11부터)
template < class T > struct is_trivially_move_assignable ; (2) (C++11부터)
template < class T > struct is_nothrow_move_assignable ; (3) (C++11부터)

만약 T가 완전한 타입(complete type)이 아니거나, (cv 한정을 포함한) void이거나, 경계를 알 수 없는 배열이라면 동작이 정의되지 않아요.

위 템플릿 중 하나의 인스턴스화가 직접 또는 간접적으로 불완전한 타입에 의존하고, 그 타입이 가상으로 완성되었을 때 인스턴스화 결과가 달라질 수 있다면 동작이 정의되지 않아요.

프로그램이 이 페이지에 설명된 템플릿 중 어떤 것에 대해 특수화를 추가하면 동작이 정의되지 않아요.

헬퍼 변수 템플릿

template < class T > constexpr bool is_move_assignable_v = is_move_assignable < T >:: value ; (C++17부터)
template < class T > constexpr bool is_trivially_move_assignable_v = is_trivially_move_assignable < T >:: value ; (C++17부터)
template < class T > constexpr bool is_nothrow_move_assignable_v = is_nothrow_move_assignable < T >:: value ; (C++17부터)

std::integral_constant로부터 상속

멤버 상수

value [static] T가 이동 대입 가능하면 true, 그렇지 않으면 false (공용 정적 멤버 상수)

멤버 함수

operator bool 객체를 bool로 변환하고 value를 반환해요 (공용 멤버 함수)
operator() (C++14) value를 반환해요 (공용 멤버 함수)

멤버 타입

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

가능한 구현

template < class T > struct is_move_assignable : std :: is_assignable < typename std :: add_lvalue_reference < T >:: type , typename std :: add_rvalue_reference < T >:: type > {};
template < class T > struct is_trivially_move_assignable : std :: is_trivially_assignable < typename std :: add_lvalue_reference < T >:: type , typename std :: add_rvalue_reference < T >:: type > {};
template < class T > struct is_nothrow_move_assignable : std :: is_nothrow_assignable < typename std :: add_lvalue_reference < T >:: type , typename std :: add_rvalue_reference < T >:: type > {};

참고 사항

std::is_move_assignable 특성은 MoveAssignable보다 덜 엄격해요. 대입 결과의 타입(MoveAssignable 타입의 경우 T&여야 해요)을 확인하지 않고, 대입 후 대상의 값이 대입 전 원본의 값과 동일해야 한다는 의미론적 요구 사항도 확인하지 않기 때문이에요.

이 특성을 만족하기 위해 타입이 이동 대입 연산자를 구현할 필요는 없어요. 자세한 내용은 MoveAssignable을 참고하세요.

예제

#include <iostream>
#include <string>
#include <type_traits>

struct Foo { int n; };

struct NoMove
{
    // prevents implicit declaration of default move assignment operator
    // however, the class is still move-assignable because its
    // copy assignment operator can bind to an rvalue argument
    NoMove& operator=(const NoMove&) { return *this; }
};

int main()
{
    std::cout << std::boolalpha
              << "std::string is nothrow move-assignable? "
              << std::is_nothrow_move_assignable<std::string>::value << '\n'
              << "int[2] is move-assignable? "
              << std::is_move_assignable<int[2]>::value << '\n'
              << "Foo is trivially move-assignable? "
              << std::is_trivially_move_assignable<Foo>::value << '\n'
              << "NoMove is move-assignable? "
              << std::is_move_assignable<NoMove>::value << '\n'
              << "NoMove is nothrow move-assignable? "
              << std::is_nothrow_move_assignable<NoMove>::value << '\n';
}

출력:

std::string is nothrow move-assignable? true
int[2] is move-assignable? false
Foo is trivially move-assignable? true
NoMove is move-assignable? true
NoMove is nothrow move-assignable? false

결함 보고

다음 동작 변경 결함 보고서는 이전에 공개된 C++ 표준에 소급 적용되었어요.

DR 적용 대상 공개된 동작 올바른 동작
LWG 2196 C++11 T&&를 형성할 수 없는 경우 동작이 불명확했어요 이 경우 생성되는 값은 false예요

같이 보기

is_assignable is_trivially_assignable is_nothrow_assignable (C++11) (C++11) (C++11) 특정 인자에 대한 대입 연산자가 있는지 검사해요 (클래스 템플릿)
is_copy_assignable is_trivially_copy_assignable is_nothrow_copy_assignable (C++11) (C++11) (C++11) 복사 대입 연산자가 있는지 검사해요 (클래스 템플릿)
move (C++11) 인자를 xvalue로 변환해요 (함수 템플릿)
move_if_noexcept (C++11) 이동 생성자가 예외를 던지지 않으면 인자를 xvalue로 변환해요 (함수 템플릿)
is_move_assignable_type is_trivially_move_assignable_type is_nothrow_move_assignable_type (C++26) (C++26) (C++26) 반영된 타입에 이동 대입 연산자가 있는지 검사해요 (함수)

더 알아보기 (Learn more)

cppreference