Type Traits#
The C++ front end implements syntactic extensions that allow compile-time determination of various characteristics of a type (or of a pair of types).
__has_nothrow_assign (type)
If
type
isconst
-qualified or is a reference type then the trait isfalse
. Otherwise if__has_trivial_assign (type)
istrue
then the trait istrue
, else iftype
is a cv-qualified class or union type with copy assignment operators that are known not to throw an exception then the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__has_nothrow_copy (type)
If
__has_trivial_copy (type)
istrue
then the trait istrue
, else iftype
is a cv-qualified class or union type with copy constructors that are known not to throw an exception then the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__has_nothrow_constructor (type)
If
__has_trivial_constructor (type)
istrue
then the trait istrue
, else iftype
is a cv class or union type (or array thereof) with a default constructor that is known not to throw an exception then the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__has_trivial_assign (type)
If
type
isconst
- qualified or is a reference type then the trait isfalse
. Otherwise if__is_trivial (type)
istrue
then the trait istrue
, else iftype
is a cv-qualified class or union type with a trivial copy assignment ([class.copy]) then the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__has_trivial_copy (type)
If
__is_trivial (type)
istrue
ortype
is a reference type then the trait istrue
, else iftype
is a cv class or union type with a trivial copy constructor ([class.copy]) then the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__has_trivial_constructor (type)
If
__is_trivial (type)
istrue
then the trait istrue
, else iftype
is a cv-qualified class or union type (or array thereof) with a trivial default constructor ([class.ctor]) then the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__has_trivial_destructor (type)
If
__is_trivial (type)
istrue
ortype
is a reference type then the trait istrue
, else iftype
is a cv class or union type (or array thereof) with a trivial destructor ([class.dtor]) then the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__has_virtual_destructor (type)
If
type
is a class type with a virtual destructor ([class.dtor]) then the trait istrue
, else it isfalse
. Requires: Iftype
is a non-union class type, it shall be a complete type.__is_abstract (type)
If
type
is an abstract class ([class.abstract]) then the trait istrue
, else it isfalse
. Requires: Iftype
is a non-union class type, it shall be a complete type.__is_aggregate (type)
If
type
is an aggregate type ([dcl.init.aggr]) the trait istrue
, else it isfalse
. Requires: Iftype
is a class type, it shall be a complete type.__is_base_of (base_type, derived_type)
If
base_type
is a base class ofderived_type
([class.derived]) then the trait istrue
, otherwise it isfalse
. Top-level cv-qualifications ofbase_type
andderived_type
are ignored. For the purposes of this trait, a class type is considered is own base. Requires: if__is_class (base_type)
and__is_class (derived_type)
aretrue
andbase_type
andderived_type
are not the same type (disregarding cv-qualifiers),derived_type
shall be a complete type. A diagnostic is produced if this requirement is not met.__is_class (type)
If
type
is a cv-qualified class type, and not a union type ([basic.compound]) the trait istrue
, else it isfalse
.__is_empty (type)
If
__is_class (type)
isfalse
then the trait isfalse
. Otherwisetype
is considered empty if and only if:type
has no non-static data members, or all non-static data members, if any, are bit-fields of length 0, andtype
has no virtual members, andtype
has no virtual base classes, andtype
has no base classesbase_type
for which__is_empty (base_type)
isfalse
. Requires: Iftype
is a non-union class type, it shall be a complete type.__is_enum (type)
If
type
is a cv enumeration type ([basic.compound]) the trait istrue
, else it isfalse
.__is_final (type)
If
type
is a class or union type markedfinal
, then the trait istrue
, else it isfalse
. Requires: Iftype
is a class type, it shall be a complete type.__is_literal_type (type)
If
type
is a literal type ([basic.types]) the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__is_pod (type)
If
type
is a cv POD type ([basic.types]) then the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, (possibly cv-qualified)void
, or an array of unknown bound.__is_polymorphic (type)
If
type
is a polymorphic class ([class.virtual]) then the trait istrue
, else it isfalse
. Requires: Iftype
is a non-union class type, it shall be a complete type.__is_standard_layout (type)
If
type
is a standard-layout type ([basic.types]) the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, an array of complete types, or (possibly cv-qualified)void
.__is_trivial (type)
If
type
is a trivial type ([basic.types]) the trait istrue
, else it isfalse
. Requires:type
shall be a complete type, an array of complete types, or (possibly cv-qualified)void
.__is_union (type)
If
type
is a cv union type ([basic.compound]) the trait istrue
, else it isfalse
.__underlying_type (type)
The underlying type of
type
. Requires:type
shall be an enumeration type ([dcl.enum]).__integer_pack (length)
When used as the pattern of a pack expansion within a template definition, expands to a template argument pack containing integers from
0
tolength-1
. This is provided for efficient implementation ofstd::make_integer_sequence
.