Type Traits (Using the GNU Compiler Collection (GCC))

### 8.9 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).

Built-in Function: `bool` __has_nothrow_assign `(type)` ¶

  If type is `const`-qualified or is a reference type then the trait is `false`. Otherwise if `__has_trivial_assign (type)` is `true` then the trait is `true`, else if type is a cv-qualified class or union type with copy assignment operators that are known not to throw an exception then the trait is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __has_nothrow_copy `(type)` ¶

  If `__has_trivial_copy (type)` is `true` then the trait is `true`, else if type is a cv-qualified class or union type with copy constructors that are known not to throw an exception then the trait is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __has_nothrow_constructor `(type)` ¶

  If `__has_trivial_constructor (type)` is `true` then the trait is `true`, else if type 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 is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __has_trivial_assign `(type)` ¶

  If type is `const`- qualified or is a reference type then the trait is `false`. Otherwise if `__is_trivial (type)` is `true` then the trait is `true`, else if type is a cv-qualified class or union type with a trivial copy assignment ([class.copy]) then the trait is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __has_trivial_copy `(type)` ¶

  If `__is_trivial (type)` is `true` or type is a reference type then the trait is `true`, else if type is a cv class or union type with a trivial copy constructor ([class.copy]) then the trait is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __has_trivial_constructor `(type)` ¶

  If `__is_trivial (type)` is `true` then the trait is `true`, else if type is a cv-qualified class or union type (or array thereof) with a trivial default constructor ([class.ctor]) then the trait is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __has_trivial_destructor `(type)` ¶

  If `__is_trivial (type)` is `true` or type is a reference type then the trait is `true`, else if type is a cv class or union type (or array thereof) with a trivial destructor ([class.dtor]) then the trait is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __has_virtual_destructor `(type)` ¶

  If type is a class type with a virtual destructor ([class.dtor]) then the trait is `true`, else it is `false`. Requires: If type is a non-union class type, it shall be a complete type.

Built-in Function: `bool` __is_abstract `(type)` ¶

  If type is an abstract class ([class.abstract]) then the trait is `true`, else it is `false`. Requires: If type is a non-union class type, it shall be a complete type.

Built-in Function: `bool` __is_aggregate `(type)` ¶

  If type is an aggregate type ([dcl.init.aggr]) the trait is `true`, else it is `false`. Requires: If type is a class type, it shall be a complete type.

Built-in Function: `bool` __is_base_of `(base_type, derived_type)` ¶

  If base_type is a base class of derived_type ([class.derived]) then the trait is `true`, otherwise it is `false`. Top-level cv-qualifications of base_type and derived_type are ignored. For the purposes of this trait, a class type is considered is own base. The trait is `true` even if base_type is an ambiguous or inaccessible base class of derived_type. Requires: if `__is_class (base_type)` and `__is_class (derived_type)` are `true` and base_type and derived_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.

Built-in Function: `bool` __builtin_is_virtual_base_of `(base_type, derived_type)` ¶

  If base_type is a virtual base class of derived_type ([class.derived], [class.mi]) then the trait is `true`, otherwise it is `false`. Top-level cv-qualifications of base_type and derived_type are ignored. The trait is `true` even if base_type is an ambiguous or inaccessible virtual base class of derived_type. Requires: if `__is_class (base_type)` and `__is_class (derived_type)` are `true`, derived_type shall be a complete type. A diagnostic is produced if this requirement is not met.

Built-in Function: `bool` __is_class `(type)` ¶

  If type is a cv-qualified class type, and not a union type ([basic.compound]) the trait is `true`, else it is `false`.

Built-in Function: `bool` __is_empty `(type)` ¶

  If `__is_class (type)` is `false` then the trait is `false`. Otherwise type 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, and type has no virtual members, and type has no virtual base classes, and type has no base classes base_type for which `__is_empty (base_type)` is `false`. Requires: If type is a non-union class type, it shall be a complete type.

Built-in Function: `bool` __is_enum `(type)` ¶

  If type is a cv enumeration type ([basic.compound]) the trait is `true`, else it is `false`.

Built-in Function: `bool` __is_final `(type)` ¶

  If type is a class or union type marked `final`, then the trait is `true`, else it is `false`. Requires: If type is a class type, it shall be a complete type.

Built-in Function: `bool` __is_literal_type `(type)` ¶

  If type is a literal type ([basic.types]) the trait is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __is_pod `(type)` ¶

  If type is a cv POD type ([basic.types]) then the trait is `true`, else it is `false`. Requires: type shall be a complete type, (possibly cv-qualified) `void`, or an array of unknown bound.

Built-in Function: `bool` __is_polymorphic `(type)` ¶

  If type is a polymorphic class ([class.virtual]) then the trait is `true`, else it is `false`. Requires: If type is a non-union class type, it shall be a complete type.

Built-in Function: `bool` __is_standard_layout `(type)` ¶

  If type is a standard-layout type ([basic.types]) the trait is `true`, else it is `false`. Requires: type shall be a complete type, an array of complete types, or (possibly cv-qualified) `void`.

Built-in Function: `bool` __is_trivial `(type)` ¶

  If type is a trivial type ([basic.types]) the trait is `true`, else it is `false`. Requires: type shall be a complete type, an array of complete types, or (possibly cv-qualified) `void`.

Built-in Function: `bool` __is_union `(type)` ¶

  If type is a cv union type ([basic.compound]) the trait is `true`, else it is `false`.

Built-in Function: `bool` __underlying_type `(type)` ¶

  The underlying type of type. Requires: type shall be an enumeration type ([dcl.enum]).

Built-in Function: `bool` __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` to `length-1`. This is provided for efficient implementation of `std::make_integer_sequence`.

Built-in Function: `bool` __is_same `(type1, type2)` ¶

  A binary type trait: `true` whenever the type1 and type2 refer to the same type.

Built-in Function: `size_t` __builtin_structured_binding_size `(type)` ¶

  This trait returns the structured binding size ([dcl.struct.bind]) of type. If a type does not have a structured binding size, an error is diagnosed unless it is used in SFINAE contexts.