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] TU로부터 할당 가능하면 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) 반영된 타입이 특정 인자에 대한 할당 연산자를 가지고 있는지 검사해요 (함수)

더 알아보기 (Learn more)

cppreference