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) |
반영된 타입에 이동 대입 연산자가 있는지 검사해요 (함수) |