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