<type_traits>

 

The latest version of this topic can be found at <type_traits>.

Defines templates that provide 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, to detect type-related errors, and to help you optimize your generic code. These classes and templates include unary type traits that describe a property of a type, binary type traits that describe a relationship between types, and transformation traits that modify a property of a type.

To support type traits, a helper class, integral_constant, is defined. It has template specializations true_type and false_type that 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 is publicly derived, directly or indirectly, from true_type. When a type predicate holds false, it is 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 template class 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;
add_const_t aligned_storage_t make_signed_t remove_pointer_t
add_cv_t aligned_union_t make_unsigned_t remove_reference_t
add_lvalue_reference_t common_type_t remove_all_extents_t remove_volatile_t
add_pointer_t conditional_t remove_const_t result_of_t
add_rvalue_reference_t decay_t remove_cv_t underlying_type_t
add_volatile_t enable_if_t remove_extent_t

Classes

Helper class and typedefs

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

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

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

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_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_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_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.

Type property queries

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

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

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

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

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

remove_all_extents Produces a non-array type from an array type.
remove_extent Produces the element type from an array type.

Pointer modifications

add_pointer Produces a pointer to type from type.
remove_pointer Produces a type from a pointer to type.

Other transformations

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.
result_of Determines the return type of the callable type that takes the specified argument types.
underlying_type Produces the underlying integral type for an enumeration type.

See Also

<functional>