Namespaces
Variants

Standard library header <type_traits> (C++11)

From cppreference.net
Standard library headers

이 헤더는 메타프로그래밍 라이브러리의 일부입니다.

목차

클래스

헬퍼 클래스
지정된 타입과 값을 가진 컴파일 타임 상수
(클래스 템플릿)
true_type std:: integral_constant < bool , true >
false_type std:: integral_constant < bool , false >
기본 타입 범주
(C++11)
타입이 void 인지 확인합니다
(클래스 템플릿)
(C++11) ( DR* )
타입이 std::nullptr_t 인지 검사합니다
(클래스 템플릿)
타입이 정수형 타입인지 검사합니다
(클래스 템플릿)
타입이 부동소수점 타입인지 검사합니다
(클래스 템플릿)
(C++11)
타입이 배열 타입인지 검사합니다
(클래스 템플릿)
(C++11)
타입이 열거형 타입인지 검사합니다
(클래스 템플릿)
(C++11)
타입이 union 타입인지 검사합니다
(클래스 템플릿)
(C++11)
타입이 비-유니온 클래스 타입인지 검사합니다
(클래스 템플릿)
타입이 함수 타입인지 확인합니다
(class template)
(C++11)
타입이 포인터 타입인지 검사합니다
(클래스 템플릿)
해당 타입이 lvalue reference 인지 확인합니다
(클래스 템플릿)
해당 타입이 rvalue reference 인지 검사합니다
(클래스 템플릿)
타입이 비정적 멤버 객체 포인터인지 확인합니다
(클래스 템플릿)
타입이 비정적 멤버 함수 포인터인지 확인합니다
(클래스 템플릿)
복합 타입 카테고리
타입이 기본 타입인지 검사합니다
(클래스 템플릿)
타입이 산술 타입인지 검사합니다
(클래스 템플릿)
(C++11)
타입이 스칼라 타입인지 검사합니다
(클래스 템플릿)
(C++11)
타입이 객체 타입인지 검사합니다
(클래스 템플릿)
타입이 복합 타입인지 검사합니다
(클래스 템플릿)
해당 타입이 lvalue reference 또는 rvalue reference 인지 검사합니다
(class template)
타입이 비정적 멤버 함수나 객체에 대한 포인터인지 검사합니다
(클래스 템플릿)
타입 속성
(C++11)
타입이 const 한정자인지 검사합니다
(클래스 템플릿)
타입이 volatile로 한정되었는지 검사합니다
(클래스 템플릿)
(C++11) (C++26에서 사용 중단됨)
타입이 trivial인지 검사합니다
(클래스 템플릿)
타입이 trivially copyable인지 검사합니다
(클래스 템플릿)
해당 타입이 standard-layout 타입인지 검사합니다
(클래스 템플릿)
(C++11) (deprecated in C++20)
타입이 POD(Plain-Old Data) 타입인지 검사합니다
(클래스 템플릿)
(C++11) (C++17에서 사용 중단됨) (C++20에서 제거됨)
리터럴 타입인지 확인합니다
(클래스 템플릿)
해당 타입의 객체 표현에서 모든 비트가 그 값에 기여하는지 검사합니다
(클래스 템플릿)
(C++11)
타입이 클래스(단, union 제외) 타입이고 비정적 데이터 멤버가 없는지 검사합니다
(클래스 템플릿)
타입이 다형성 클래스 타입인지 검사합니다
(클래스 템플릿)
타입이 추상 클래스 타입인지 검사합니다
(클래스 템플릿)
(C++14)
타입이 final 클래스 타입인지 검사합니다
(클래스 템플릿)
타입이 집계 타입인지 검사합니다
(클래스 템플릿)
타입이 암시적 수명 타입인지 확인합니다
(클래스 템플릿)
(C++11)
타입이 부호 있는 산술 타입인지 검사합니다
(클래스 템플릿)
타입이 부호 없는 산술 타입인지 검사합니다
(class template)
타입이 알려진 경계를 가진 배열 타입인지 검사합니다
(클래스 템플릿)
타입이 경계를 알 수 없는 배열 타입인지 검사합니다
(클래스 템플릿)
타입이 범위 지정 열거형 타입인지 검사합니다
(클래스 템플릿)
지원되는 연산
특정 인수에 대한 생성자가 있는지 여부를 확인합니다
(클래스 템플릿)
기본 생성자가 있는지 여부를 확인합니다
(클래스 템플릿)
복사 생성자가 있는지 여부를 확인합니다
(클래스 템플릿)
rvalue 참조로부터 생성 가능한지 여부를 확인합니다
(클래스 템플릿)
특정 인수에 대한 할당 연산자가 있는지 여부를 확인합니다
(클래스 템플릿)
복사 할당 연산자가 있는지 여부를 확인합니다
(클래스 템플릿)
이동 할당 연산자가 있는지 여부를 확인합니다
(클래스 템플릿)
삭제되지 않은 소멸자가 있는지 여부를 확인합니다
(클래스 템플릿)
가상 소멸자가 있는지 여부를 확인합니다
(클래스 템플릿)
동일한 타입이나 다른 타입의 객체와 교환 가능한지 여부를 확인합니다
(클래스 템플릿)
복사 초기화에서 임시 객체에 참조가 바인딩되는지 여부를 확인합니다
(클래스 템플릿)
직접 초기화에서 임시 객체에 참조가 바인딩되는지 여부를 확인합니다
(클래스 템플릿)
속성 쿼리
타입의 정렬 요구 사항을 얻음
(클래스 템플릿)
(C++11)
배열 타입의 차원 수를 얻음
(클래스 템플릿)
(C++11)
지정된 차원을 따른 배열 타입의 크기를 얻음
(클래스 템플릿)
타입 관계
(C++11)
두 타입이 동일한지 검사합니다
(클래스 템플릿)
(C++11)
한 타입이 다른 타입의 기반인지 검사합니다
(클래스 템플릿)
한 타입이 다른 타입의 가상 베이스인지 검사합니다
(클래스 템플릿)
한 타입이 다른 타입으로 변환 가능한지 검사합니다
(클래스 템플릿)
두 타입이 layout-compatible 인지 확인합니다
(클래스 템플릿)
한 타입이 다른 타입의 포인터 상호 변환 가능 (초기) 베이스인지 확인합니다
(클래스 템플릿)
주어진 인수 타입들로 (마치 std::invoke 를 사용하듯이) 호출 가능한 타입인지 확인합니다
(클래스 템플릿)
Const-volatility 지정자
주어진 타입에서 const 및/또는 volatile 지정자를 제거함
(클래스 템플릿)
(C++11) (C++11) (C++11)
주어진 타입에 const 및/또는 volatile 지정자를 추가함
(클래스 템플릿)
참고문헌
주어진 타입에서 참조를 제거함
(클래스 템플릿)
주어진 타입에 lvalue 또는 rvalue 참조자를 추가함
(클래스 템플릿)
포인터
주어진 타입에서 포인터를 제거함
(클래스 템플릿)
주어진 타입에 포인터를 추가함
(클래스 템플릿)
부호 지정자
주어진 정수형에 해당하는 부호 있는 타입을 얻음
(클래스 템플릿)
주어진 정수형에 해당하는 부호 없는 타입을 얻음
(클래스 템플릿)
배열
주어진 배열 타입에서 하나의 차원을 제거함
(클래스 템플릿)
주어진 배열 타입에서 모든 차원을 제거함
(클래스 템플릿)
기타 변환
(since C++11) (deprecated in C++23)
주어진 크기의 타입들을 위한 초기화되지 않은 저장 공간으로 사용하기 적합한 타입을 정의함
(class template)
(since C++11) (deprecated in C++23)
주어진 모든 타입을 위한 초기화되지 않은 저장 공간으로 사용하기 적합한 타입을 정의함
(클래스 템플릿)
(C++11)
함수 인자를 값으로 전달할 때와 같은 타입 변환을 적용합니다
(클래스 템플릿)
std::remove_cv std::remove_reference 를 결합
(클래스 템플릿)
(C++11)
오버로드 해결에서 함수 오버로드나 템플릿 특수화를 조건부로 제거합니다
(클래스 템플릿)
컴파일 타임 불리언 값에 따라 한 타입 또는 다른 타입을 선택합니다
(클래스 템플릿)
여러 타입들의 공통 타입을 결정합니다
(클래스 템플릿)
여러 타입들의 공통 참조 타입을 결정합니다
(클래스 템플릿)
주어진 열거형 타입에 대한 기본 정수 타입을 구함
(클래스 템플릿)
(C++11) (C++20에서 제거됨) (C++17)
호출 가능 객체를 인수 집합으로 호출한 결과 타입을 추론합니다
(클래스 템플릿)
(C++17)
void 가변 인자 앨리어스 템플릿
(앨리어스 템플릿)
타입 인자를 변경 없이 반환함
(클래스 템플릿)
std::reference_wrapper 에 감싸진 참조 타입을 얻음
(클래스 템플릿)
트레이트 연산
가변 논리 AND 메타함수
(클래스 템플릿)
가변 논리 OR 메타함수
(클래스 템플릿)
(C++17)
논리적 NOT 메타함수
(클래스 템플릿)

함수

멤버 관계
해당 타입의 객체가 해당 타입의 지정된 서브오브젝트와 pointer-interconvertible 한지 확인합니다
(함수 템플릿)
두 지정된 타입의 공통 초기 부분 순서에서 두 지정된 멤버가 서로 대응하는지 확인합니다
(function template)
상수 평가 컨텍스트
호출이 상수 평가 컨텍스트 내에서 발생하는지 감지합니다
(함수)
컴파일 타임에 포인터가 객체의 수명 범위 내에 있는지 확인합니다
(함수)

시놉시스

namespace std {
  // 헬퍼 클래스
  template<class T, T v> struct integral_constant;
  template<bool B>
    using bool_constant = integral_constant<bool, B>;
  using true_type  = bool_constant<true>;
  using false_type = bool_constant<false>;
  // 기본 타입 카테고리
  template<class T> struct is_void;
  template<class T> struct is_null_pointer;
  template<class T> struct is_integral;
  template<class T> struct is_floating_point;
  template<class T> struct is_array;
  template<class T> struct is_pointer;
  template<class T> struct is_lvalue_reference;
  template<class T> struct is_rvalue_reference;
  template<class T> struct is_member_object_pointer;
  template<class T> struct is_member_function_pointer;
  template<class T> struct is_enum;
  template<class T> struct is_union;
  template<class T> struct is_class;
  template<class T> struct is_function;
  // 복합 타입 카테고리
  template<class T> struct is_reference;
  template<class T> struct is_arithmetic;
  template<class T> struct is_fundamental;
  template<class T> struct is_object;
  template<class T> struct is_scalar;
  template<class T> struct is_compound;
  template<class T> struct is_member_pointer;
  // 타입 속성
  template<class T> struct is_const;
  template<class T> struct is_volatile;
  template<class T> struct is_trivial;
  template<class T> struct is_trivially_copyable;
  template<class T> struct is_standard_layout;
  template<class T> struct is_empty;
  template<class T> struct is_polymorphic;
  template<class T> struct is_abstract;
  template<class T> struct is_final;
  template<class T> struct is_aggregate;
  template<class T> struct is_signed;
  template<class T> struct is_unsigned;
  template<class T> struct is_bounded_array;
  template<class T> struct is_unbounded_array;
  template<class T> struct is_scoped_enum;
  template<class T, class... Args> struct is_constructible;
  template<class T> struct is_default_constructible;
  template<class T> struct is_copy_constructible;
  template<class T> struct is_move_constructible;
  template<class T, class U> struct is_assignable;
  template<class T> struct is_copy_assignable;
  template<class T> struct is_move_assignable;
  template<class T, class U> struct is_swappable_with;
  template<class T> struct is_swappable;
  template<class T> struct is_destructible;
  template<class T, class... Args> struct is_trivially_constructible;
  template<class T> struct is_trivially_default_constructible;
  template<class T> struct is_trivially_copy_constructible;
  template<class T> struct is_trivially_move_constructible;
  template<class T, class U> struct is_trivially_assignable;
  template<class T> struct is_trivially_copy_assignable;
  template<class T> struct is_trivially_move_assignable;
  template<class T> struct is_trivially_destructible;
  template<class T, class... Args> struct is_nothrow_constructible;
  template<class T> struct is_nothrow_default_constructible;
  template<class T> struct is_nothrow_copy_constructible;
  template<class T> struct is_nothrow_move_constructible;
  template<class T, class U> struct is_nothrow_assignable;
  template<class T> struct is_nothrow_copy_assignable;
  template<class T> struct is_nothrow_move_assignable;
  template<class T, class U> struct is_nothrow_swappable_with;
  template<class T> struct is_nothrow_swappable;
  template<class T> struct is_nothrow_destructible;
  template<class T> struct has_virtual_destructor;
  template<class T> struct has_unique_object_representations;
  template<class T, class U> struct reference_constructs_from_temporary;
  template<class T, class U> struct reference_converts_from_temporary;
  // 타입 속성 쿼리
  template<class T> struct alignment_of;
  template<class T> struct rank;
  template<class T, unsigned I = 0> struct extent;
  // 타입 관계
  template<class T, class U> struct is_same;
  template<class Base, class Derived> struct is_base_of;
  template<class Base, class Derived> struct is_virtual_base_of;
  template<class From, class To> struct is_convertible;
  template<class From, class To> struct is_nothrow_convertible;
  template<class T, class U> struct is_layout_compatible;
  template<class Base, class Derived> struct is_pointer_interconvertible_base_of;
  template<class Fn, class... ArgTypes> struct is_invocable;
  template<class R, class Fn, class... ArgTypes> struct is_invocable_r;
  template<class Fn, class... ArgTypes> struct is_nothrow_invocable;
  template<class R, class Fn, class... ArgTypes> struct is_nothrow_invocable_r;
  // const-volatile 수정자
  template<class T> struct remove_const;
  template<class T> struct remove_volatile;
  template<class T> struct remove_cv;
  template<class T> struct add_const;
  template<class T> struct add_volatile;
  template<class T> struct add_cv;
  template<class T>
    using remove_const_t    = typename remove_const<T>::type;
  template<class T>
    using remove_volatile_t = typename remove_volatile<T>::type;
  template<class T>
    using remove_cv_t       = typename remove_cv<T>::type;
  template<class T>
    using add_const_t       = typename add_const<T>::type;
  template<class T>
    using add_volatile_t    = typename add_volatile<T>::type;
  template<class T>
    using add_cv_t          = typename add_cv<T>::type;
  // 참조 수정
  template<class T> struct remove_reference;
  template<class T> struct add_lvalue_reference;
  template<class T> struct add_rvalue_reference;
  template<class T>
    using remove_reference_t     = typename remove_reference<T>::type;
  template<class T>
    using add_lvalue_reference_t = typename add_lvalue_reference<T>::type;
  template<class T>
    using add_rvalue_reference_t = typename add_rvalue_reference<T>::type;
  // 부호 수정
  template<class T> struct make_signed;
  template<class T> struct make_unsigned;
  template<class T>
    using make_signed_t   = typename make_signed<T>::type;
  template<class T>
    using make_unsigned_t = typename make_unsigned<T>::type;
  // 배열 수정
  template<class T> struct remove_extent;
  template<class T> struct remove_all_extents;
  template<class T>
    using remove_extent_t      = typename remove_extent<T>::type;
  template<class T>
    using remove_all_extents_t = typename remove_all_extents<T>::type;
  // 포인터 수정
  template<class T> struct remove_pointer;
  template<class T> struct add_pointer;
  template<class T>
    using remove_pointer_t = typename remove_pointer<T>::type;
  template<class T>
    using add_pointer_t    = typename add_pointer<T>::type;
  // 다른 변환들
  template<class T> struct type_identity;
  template<class T> struct remove_cvref;
  template<class T> struct decay;
  template<bool, class T = void> struct enable_if;
  template<bool, class T, class F> struct conditional;
  template<class... T> struct common_type;
  template<class T, class U, template<class> class TQual, template<class> class UQual>
    struct basic_common_reference { };
  template<class... T> struct common_reference;
  template<class T> struct underlying_type;
  template<class Fn, class... ArgTypes> struct invoke_result;
  template<class T> struct unwrap_reference;
  template<class T> struct unwrap_ref_decay;
  template<class T>
    using type_identity_t    = typename type_identity<T>::type;
  template<class T>
    using remove_cvref_t     = typename remove_cvref<T>::type;
  template<class T>
    using decay_t            = typename decay<T>::type;
  template<bool b, class T = void>
    using enable_if_t        = typename enable_if<b, T>::type;
  template<bool b, class T, class F>
    using conditional_t      = typename conditional<b, T, F>::type;
  template<class... T>
    using common_type_t      = typename common_type<T...>::type;
  template<class... T>
    using common_reference_t = typename common_reference<T...>::type;
  template<class T>
    using underlying_type_t  = typename underlying_type<T>::type;
  template<class Fn, class... ArgTypes>
    using invoke_result_t    = typename invoke_result<Fn, ArgTypes...>::type;
  template<class T>
    using unwrap_reference_t = typename unwrap_reference<T>::type;
  template<class T>
    using unwrap_ref_decay_t = typename unwrap_ref_decay<T>::type;
  template<class...>
    using void_t             = void;
  // 논리 연산자 특성
  template<class... B> struct conjunction;
  template<class... B> struct disjunction;
  template<class B> struct negation;
  // 기본 타입 카테고리
  template<class T>
    inline constexpr bool is_void_v = is_void<T>::value;
  template<class T>
    inline constexpr bool is_null_pointer_v = is_null_pointer<T>::value;
  template<class T>
    inline constexpr bool is_integral_v = is_integral<T>::value;
  template<class T>
    inline constexpr bool is_floating_point_v = is_floating_point<T>::value;
  template<class T>
    inline constexpr bool is_array_v = is_array<T>::value;
  template<class T>
    inline constexpr bool is_pointer_v = is_pointer<T>::value;
  template<class T>
    inline constexpr bool is_lvalue_reference_v = is_lvalue_reference<T>::value;
  template<class T>
    inline constexpr bool is_rvalue_reference_v = is_rvalue_reference<T>::value;
  template<class T>
    inline constexpr bool is_member_object_pointer_v = is_member_object_pointer<T>::value;
  template<class T>
    inline constexpr bool is_member_function_pointer_v = is_member_function_pointer<T>::value;
  template<class T>
    inline constexpr bool is_enum_v = is_enum<T>::value;
  template<class T>
    inline constexpr bool is_union_v = is_union<T>::value;
  template<class T>
    inline constexpr bool is_class_v = is_class<T>::value;
  template<class T>
    inline constexpr bool is_function_v = is_function<T>::value;
  // 복합 타입 카테고리
  template<class T>
    inline constexpr bool is_reference_v = is_reference<T>::value;
  template<class T>
    inline constexpr bool is_arithmetic_v = is_arithmetic<T>::value;
  template<class T>
    inline constexpr bool is_fundamental_v = is_fundamental<T>::value;
  template<class T>
    inline constexpr bool is_object_v = is_object<T>::value;
  template<class T>
    inline constexpr bool is_scalar_v = is_scalar<T>::value;
  template<class T>
    inline constexpr bool is_compound_v = is_compound<T>::value;
  template<class T>
    inline constexpr bool is_member_pointer_v = is_member_pointer<T>::value;
  // 타입 속성
  template<class T>
    inline constexpr bool is_const_v = is_const<T>::value;
  template<class T>
    inline constexpr bool is_volatile_v = is_volatile<T>::value;
  template<class T>
    inline constexpr bool is_trivial_v = is_trivial<T>::value;
  template<class T>
    inline constexpr bool is_trivially_copyable_v = is_trivially_copyable<T>::value;
  template<class T>
    inline constexpr bool is_standard_layout_v = is_standard_layout<T>::value;
  template<class T>
    inline constexpr bool is_empty_v = is_empty<T>::value;
  template<class T>
    inline constexpr bool is_polymorphic_v = is_polymorphic<T>::value;
  template<class T>
    inline constexpr bool is_abstract_v = is_abstract<T>::value;
  template<class T>
    inline constexpr bool is_final_v = is_final<T>::value;
  template<class T>
    inline constexpr bool is_aggregate_v = is_aggregate<T>::value;
  template<class T>
    inline constexpr bool is_signed_v = is_signed<T>::value;
  template<class T>
    inline constexpr bool is_unsigned_v = is_unsigned<T>::value;
  template<class T>
    inline constexpr bool is_bounded_array_v = is_bounded_array<T>::value;
  template<class T>
    inline constexpr bool is_unbounded_array_v = is_unbounded_array<T>::value;
  template<class T>
    inline constexpr bool is_scoped_enum_v = is_scoped_enum<T>::value;
  template<class T, class... Args>
    inline constexpr bool is_constructible_v = is_constructible<T, Args...>::value;
  template<class T>
    inline constexpr bool is_default_constructible_v = is_default_constructible<T>::value;
  template<class T>
    inline constexpr bool is_copy_constructible_v = is_copy_constructible<T>::value;
  template<class T>
    inline constexpr bool is_move_constructible_v = is_move_constructible<T>::value;
  template<class T, class U>
    inline constexpr bool is_assignable_v = is_assignable<T, U>::value;
  template<class T>
    inline constexpr bool is_copy_assignable_v = is_copy_assignable<T>::value;
  template<class T>
    inline constexpr bool is_move_assignable_v = is_move_assignable<T>::value;
  template<class T, class U>
    inline constexpr bool is_swappable_with_v = is_swappable_with<T, U>::value;
  template<class T>
    inline constexpr bool is_swappable_v = is_swappable<T>::value;
  template<class T>
    inline constexpr bool is_destructible_v = is_destructible<T>::value;
  template<class T, class... Args>
    inline constexpr bool is_trivially_constructible_v
      = is_trivially_constructible<T, Args...>::value;
  template<class T>
    inline constexpr bool is_trivially_default_constructible_v
      = is_trivially_default_constructible<T>::value;
  template<class T>
    inline constexpr bool is_trivially_copy_constructible_v
      = is_trivially_copy_constructible<T>::value;
  template<class T>
    inline constexpr bool is_trivially_move_constructible_v
      = is_trivially_move_constructible<T>::value;
  template<class T, class U>
    inline constexpr bool is_trivially_assignable_v = is_trivially_assignable<T, U>::value;
  template<class T>
    inline constexpr bool is_trivially_copy_assignable_v
      = is_trivially_copy_assignable<T>::value;
  template<class T>
    inline constexpr bool is_trivially_move_assignable_v
      = is_trivially_move_assignable<T>::value;
  template<class T>
    inline constexpr bool is_trivially_destructible_v = is_trivially_destructible<T>::value;
  template<class T, class... Args>
    inline constexpr bool is_nothrow_constructible_v
      = is_nothrow_constructible<T, Args...>::value;
  template<class T>
    inline constexpr bool is_nothrow_default_constructible_v
      = is_nothrow_default_constructible<T>::value;
  template<class T>
    inline constexpr bool is_nothrow_copy_constructible_v
      = is_nothrow_copy_constructible<T>::value;
  template<class T>
    inline constexpr bool is_nothrow_move_constructible_v
      = is_nothrow_move_constructible<T>::value;
  template<class T, class U>
    inline constexpr bool is_nothrow_assignable_v = is_nothrow_assignable<T, U>::value;
  template<class T>
    inline constexpr bool is_nothrow_copy_assignable_v = is_nothrow_copy_assignable<T>::value;
  template<class T>
    inline constexpr bool is_nothrow_move_assignable_v = is_nothrow_move_assignable<T>::value;
  template<class T, class U>
    inline constexpr bool is_nothrow_swappable_with_v = is_nothrow_swappable_with<T, U>::value;
  template<class T>
    inline constexpr bool is_nothrow_swappable_v = is_nothrow_swappable<T>::value;
  template<class T>
    inline constexpr bool is_nothrow_destructible_v = is_nothrow_destructible<T>::value;
  template<class T>
    inline constexpr bool has_virtual_destructor_v = has_virtual_destructor<T>::value;
  template<class T>
    inline constexpr bool has_unique_object_representations_v
      = has_unique_object_representations<T>::value;
  template<class T, class U>
    inline constexpr bool reference_constructs_from_temporary_v
      = reference_constructs_from_temporary<T, U>::value;
  template<class T, class U>
    inline constexpr bool reference_converts_from_temporary_v
      = reference_converts_from_temporary<T, U>::value;
  // 타입 속성 쿼리
  template<class T>
    inline constexpr size_t alignment_of_v = alignment_of<T>::value;
  template<class T>
    inline constexpr size_t rank_v = rank<T>::value;
  template<class T, unsigned I = 0>
    inline constexpr size_t extent_v = extent<T, I>::value;
  // 타입 관계
  template<class T, class U>
    inline constexpr bool is_same_v = is_same<T, U>::value;
  template<class Base, class Derived>
    inline constexpr bool is_base_of_v = is_base_of<Base, Derived>::value;
  template<class Base, class Derived>
    inline constexpr bool is_virtual_base_of_v = is_virtual_base_of<Base, Derived>::value;
  template<class From, class To>
    inline constexpr bool is_convertible_v = is_convertible<From, To>::value;
  template<class From, class To>
    inline constexpr bool is_nothrow_convertible_v = is_nothrow_convertible<From, To>::value;
  template<class T, class U>
    inline constexpr bool is_layout_compatible_v = is_layout_compatible<T, U>::value;
  template<class Base, class Derived>
    inline constexpr bool is_pointer_interconvertible_base_of_v
      = is_pointer_interconvertible_base_of<Base, Derived>::value;
  template<class Fn, class... ArgTypes>
    inline constexpr bool is_invocable_v = is_invocable<Fn, ArgTypes...>::value;
  template<class R, class Fn, class... ArgTypes>
    inline constexpr bool is_invocable_r_v = is_invocable_r<R, Fn, ArgTypes...>::value;
  template<class Fn, class... ArgTypes>
    inline constexpr bool is_nothrow_invocable_v = is_nothrow_invocable<Fn, ArgTypes...>::value;
  template<class R, class Fn, class... ArgTypes>
    inline constexpr bool is_nothrow_invocable_r_v
      = is_nothrow_invocable_r<R, Fn, ArgTypes...>::value;
  // 논리 연산자 특성
  template<class... B>
    inline constexpr bool conjunction_v = conjunction<B...>::value;
  template<class... B>
    inline constexpr bool disjunction_v = disjunction<B...>::value;
  template<class B>
    inline constexpr bool negation_v = negation<B>::value;
  // 멤버 관계
  template<class S, class M>
    constexpr bool is_pointer_interconvertible_with_class(M S::*m) noexcept;
  template<class S1, class S2, class M1, class M2>
    constexpr bool is_corresponding_member(M1 S1::*m1, M2 S2::*m2) noexcept;
  // 상수 평가 컨텍스트
  constexpr bool is_constant_evaluated() noexcept;
  consteval bool is_within_lifetime(const auto*) noexcept;
}

클래스 템플릿 std::integral_constant

namespace std {
  template <class T, T v>
  struct integral_constant {
    static constexpr T value = v;
    using value_type = T;
    using type = integral_constant<T, v>;
    constexpr operator value_type() const noexcept { return value; }
    constexpr value_type operator()() const noexcept { return value; }
  };
}