<type_traits>
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 |