Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Defines templates for compile-time constants that give information about the properties of their type arguments, or produce transformed types.
Syntax
#include <type_traits>
Remarks
The classes and templates in <type_traits> are used to support type inference, classification, and transformation at compile time. They are also used to detect type-related errors, and to help you optimize your generic code. Unary type traits describe a property of a type, binary type traits describe a relationship between types, and transformation traits modify a property of a type.
The helper class integral_constant and its template specializations true_type and false_type form the base classes for type predicates. A type predicate is a template that takes one or more type arguments. When a type predicate holds true, it's publicly derived, directly or indirectly, from true_type. When a type predicate holds false, it's publicly derived, directly or indirectly, from false_type.
A type modifier or transformation trait is a template that takes one or more template arguments and has one member, type, which is a synonym for the modified type.
Alias Templates
To simplify type traits expressions, alias templates for typename some_trait<T>::type are provided, where some_trait is the class template name. For example, add_const has an alias template for its type, add_const_t, defined as:
template <class T>
using add_const_t = typename add_const<T>::type;
These are the provided aliases for the type members:
add_const_t
add_cv_t
add_lvalue_reference_t
add_pointer_t
add_rvalue_reference_t
add_volatile_t
aligned_storage_t
aligned_union_t
common_type_t
conditional_t
decay_t
enable_if_t
invoke_result_t
make_signed_t
make_unsigned_t
remove_all_extents_t
remove_const_t
remove_cv_t
remove_extent_t
remove_pointer_t
remove_reference_t
remove_volatile_t
result_of_t
underlying_type_t
Classes
Helper class and typedefs
| Name | Description |
|---|---|
| integral_constant | Makes an integral constant from a type and a value. |
| true_type | Holds integral constant with true value. |
| false_type | Holds integral constant with false value. |
Primary type categories
| Name | Description |
|---|---|
| is_void | Tests whether the type is void. |
| is_null_pointer | Tests whether the type is std::nullptr_t. |
| is_integral | Tests whether the type is integral. |
| is_floating_point | Tests whether the type is floating-point. |
| is_array | Tests whether the type is an array. |
| is_pointer | Tests whether the type is a pointer. |
| is_lvalue_reference | Tests if type is an lvalue reference. |
| is_rvalue_reference | Tests if type is an rvalue reference. |
| is_member_object_pointer | Tests whether the type is a pointer to a member object. |
| is_member_function_pointer | Tests whether the type is a pointer to a member function. |
| is_enum | Tests whether the type is an enumeration. |
| is_union | Tests whether the type is a union. |
| is_class | Tests whether the type is a class. |
| is_function | Tests whether the type is a function type. |
Composite type categories
| Name | Description |
|---|---|
| is_reference | Tests whether the type is a reference. |
| is_arithmetic | Tests whether the type is arithmetic. |
| is_fundamental | Tests whether the type is void or arithmetic. |
| is_object | Tests whether the type is an object type. |
| is_scalar | Tests whether the type is scalar. |
| is_compound | Tests whether the type is not scalar. |
| is_member_pointer | Tests whether the type is a pointer to a member. |
Type properties
| Name | Description |
|---|---|
| is_const | Tests whether the type is const. |
| is_volatile | Tests whether the type is volatile. |
| is_trivial | Tests whether the type is trivial. |
| is_trivially_copyable | Tests whether the type is trivially copyable. |
| is_standard_layout | Tests if type is a standard layout type. |
| is_pod | Tests whether the type is a POD. |
| is_literal_type | Tests whether the type can be a constexpr variable or used in a constexpr function. |
| is_empty | Tests whether the type is an empty class. |
| is_polymorphic | Tests whether the type is a polymorphic class. |
| is_abstract | Tests whether the type is an abstract class. |
| is_final | Tests whether the type is a class type marked final. |
| is_aggregate | |
| is_signed | Tests whether the type is a signed integer. |
| is_unsigned | Tests whether the type is an unsigned integer. |
| is_constructible | Tests whether the type is constructible using the specified argument types. |
| is_default_constructible | Tests whether the type has a default constructor. |
| is_copy_constructible | Tests whether the type has a copy constructor. |
| is_move_constructible | Tests whether the type has a move constructor. |
| is_assignable | Tests whether the first type can be assigned a value of the second type. |
| is_copy_assignable | Tests whether a type can be assigned a const reference value of the type. |
| is_move_assignable | Tests whether a type can be assigned an rvalue reference of the type. |
| is_swappable | |
| is_swappable_with | |
| is_destructible | Tests whether the type is destructible. |
| is_trivially_constructible | Tests whether the type uses no non-trivial operations when constructed using the specified types. |
| is_trivially_default_constructible | Tests whether the type uses no non-trivial operations when default constructed. |
| is_trivially_copy_constructible | Tests whether the type uses no non-trivial operations when copy constructed. |
| is_trivially_move_constructible | Tests whether the type uses no non-trivial operations when move constructed. |
| is_trivially_assignable | Tests whether the types are assignable and the assignment uses no non-trivial operations. |
| is_trivially_copy_assignable | Tests whether the type is copy assignable and the assignment uses no non-trivial operations. |
| is_trivially_move_assignable | Tests whether the type is move assignable and the assignment uses no non-trivial operations. |
| is_trivially_destructible | Tests whether the type is destructible and the destructor uses no non-trivial operations. |
| is_nothrow_constructible | Tests whether the type is constructible and is known not to throw when constructed using the specified types. |
| is_nothrow_default_constructible | Tests whether the type is default constructible and is known not to throw when default constructed. |
| is_nothrow_copy_constructible | Tests whether the type is copy constructible and the copy constructor is known not to throw. |
| is_nothrow_move_constructible | Tests whether the type is move constructible and the move constructor is known not to throw. |
| is_nothrow_assignable | Tests whether the type is assignable using the specified type and the assignment is known not to throw. |
| is_nothrow_copy_assignable | Tests whether the type is copy assignable and the assignment is known not to throw. |
| is_nothrow_move_assignable | Tests whether the type is move assignable and the assignment is known not to throw. |
| is_nothrow_swappable | |
| is_nothrow_swappable_with | |
| is_nothrow_destructible | Tests whether the type is destructible and the destructor is known not to throw. |
has_virtual_destructor |
Tests whether the type has a virtual destructor. |
has_unique_object_representations |
|
| is_invocable | Tests whether a callable type can be invoked using the specified argument types. Added in C++17. |
| is_invocable_r | Tests whether a callable type can be invoked using the specified argument types and the result is convertible to the specified type. Added in C++17. |
| is_nothrow_invocable | Tests whether a callable type can be invoked using the specified argument types and is known not to throw exceptions. Added in C++17. |
| is_nothrow_invocable_r | Tests whether a callable type can be invoked using the specified argument types and is known not to throw exceptions, and the result is convertible to the specified type. Added in C++17. |
Type property queries
| Name | Description |
|---|---|
| alignment_of | Gets the alignment of a type. |
| rank | Gets the number of array dimensions. |
| extent | Gets the number of elements in the specified array dimension. |
Type relations
| Name | Description |
|---|---|
| is_same | Tests whether two types are the same. |
| is_base_of | Tests whether one type is a base of another. |
| is_convertible | Tests whether one type is convertible to another. |
Const-volatile modifications
| Name | Description |
|---|---|
| add_const | Produces a const type from type. |
| add_volatile | Produces a volatile type from type. |
| add_cv | Produces a const volatile type from type. |
| remove_const | Produces a non-const type from type. |
| remove_volatile | Produces a non-volatile type from type. |
| remove_cv | Produces a non-const non-volatile type from type. |
Reference modifications
| Name | Description |
|---|---|
| add_lvalue_reference | Produces a reference to type from type. |
| add_rvalue_reference | Produces an rvalue reference to type from type |
| remove_reference | Produces a non-reference type from type. |
Sign modifications
| Name | Description |
|---|---|
| make_signed | Produces the type if signed, or the smallest signed type greater than or equal in size to type. |
| make_unsigned | Produces the type if unsigned, or the smallest unsigned type greater than or equal in size to type. |
Array modifications
| Name | Description |
|---|---|
| remove_all_extents | Produces a non-array type from an array type. |
| remove_extent | Produces the element type from an array type. |
Pointer modifications
| Name | Description |
|---|---|
| add_pointer | Produces a pointer to type from type. |
| remove_pointer | Produces a type from a pointer to type. |
Other transformations
| Name | Description |
|---|---|
| aligned_storage | Allocates uninitialized memory for an aligned type. |
| aligned_union | Allocates uninitialized memory for an aligned union with a non-trivial constructor or destructor. |
| common_type | Produces the common type of all the types of the parameter pack. |
| conditional | If the condition is true, produces the first specified type, otherwise the second specified type. |
| decay | Produces the type as passed by value. Makes non-reference, non-const, or non-volatile type, or makes a pointer to type. |
| enable_if | If the condition is true, produces the specified type, otherwise no type. |
| invoke_result | Determines the return type of the callable type that takes the specified argument types. Added in C++17. |
| result_of | Determines the return type of the callable type that takes the specified argument types. Added in C++14, deprecated in C++17. |
| underlying_type | Produces the underlying integral type for an enumeration type. |
Logical operator traits
| Name | Description |
|---|---|
| conjunction | |
| disjunction | |
| negation |