types_is_assignable
types_is_assignable (할당 가능성 검사)
이 페이지는 C++ 표준 라이브러리의 <type_traits> 헤더에 정의된 std::is_assignable, std::is_trivially_assignable, std::is_nothrow_assignable 및 관련 변수 템플릿에 대해 설명해요. 이 타입 특성들은 어떤 타입의 객체가 다른 타입의 값으로 할당될 수 있는지 컴파일 타임에 검사하는 데 사용돼요.
출처: cppreference
본문
정의
<type_traits> 헤더에 정의됨:
| 템플릿 정의 | (1) | (C++11부터) |
|---|---|---|
template <class T, class U> struct is_assignable; |
(2) | (C++11부터) |
template <class T, class U> struct is_trivially_assignable; |
(3) | (C++11부터) |
template <class T, class U> struct is_nothrow_assignable; |
만약 T 또는 U가 완전한 타입(complete type)이 아니거나, (cv 한정된) void이거나, 크기를 알 수 없는 배열이라면, 동작은 정의되지 않아요.
위 템플릿 중 하나의 인스턴스화가 불완전한 타입에 직간접적으로 의존하고, 그 타입이 가상으로 완성되었을 때 결과가 달라질 수 있다면, 동작은 정의되지 않아요.
이 페이지에 설명된 템플릿들에 대해 프로그램이 특수화를 추가하면, 동작은 정의되지 않아요.
헬퍼 변수 템플릿
| 변수 템플릿 | (C++17부터) | |
|---|---|---|
template <class T, class U> constexpr bool is_assignable_v = is_assignable<T, U>::value; |
(C++17부터) | |
template <class T, class U> constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value; |
(C++17부터) | |
template <class T, class U> constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value; |
std::integral_constant에서 상속됨
멤버 상수
| 멤버 상수 | 정의 |
|---|---|
value [static] |
T가 U로부터 할당 가능하면 true, 아니면 false (공용 정적 멤버 상수) |
멤버 함수
| 멤버 함수 | 정의 |
|---|---|
operator bool |
객체를 bool로 변환하고 value를 반환해요 (공용 멤버 함수) |
operator() (C++14) |
value를 반환해요 (공용 멤버 함수) |
멤버 타입
| 타입 | 정의 |
|---|---|
value_type |
bool |
type |
std::integral_constant<bool, value> |
참고 사항
이 특성은 할당 표현식의 직접적인 문맥 밖에서는 아무것도 검사하지 않아요. T 또는 U를 사용하는 것이 템플릿 특수화나 암시적으로 정의된 특수 멤버 함수의 생성을 유발하고, 그 과정에서 오류가 발생한다면, 실제 할당은 std::is_assignable<T, U>::value가 컴파일되고 true로 평가되더라도 컴파일되지 않을 수 있어요.
예제
#include <string>
#include <type_traits>
struct C { int n; };
static_assert(
std::is_assignable<int, int>::value == false && // Error, 1 = 1 won't compile
std::is_assignable<int&, int>::value == true && // OK, int a; a = 1;
std::is_assignable<int, double>::value == false && // Error, 1 = 1.0;
std::is_nothrow_assignable_v<int&, double> == true && // OK, int a; a = 1.0;
// uses implicit conversion double -> char, then string::operator=(char)
std::is_assignable_v<std::string, double> == true && // OK, s = 69.6; s == 'E'
std::is_trivially_assignable_v<C&, const C&> == true
);
int main() {}
같이 보기
| 관련 항목 | 설명 |
|---|---|
is_copy_assignable, is_trivially_copy_assignable, is_nothrow_copy_assignable (C++11) (C++11) (C++11) |
타입에 복사 할당 연산자가 있는지 검사해요 (클래스 템플릿) |
is_move_assignable, is_trivially_move_assignable, is_nothrow_move_assignable (C++11) (C++11) (C++11) |
타입에 이동 할당 연산자가 있는지 검사해요 (클래스 템플릿) |
assignable_from (C++20) |
한 타입이 다른 타입으로부터 할당 가능함을 명시해요 (컨셉) |
is_assignable_type, is_trivially_assignable_type, is_nothrow_assignable_type (C++26) (C++26) (C++26) |
반영된 타입이 특정 인자에 대한 할당 연산자를 가지고 있는지 검사해요 (함수) |