7.9 Типы-признаки
Передняя часть C++ реализует синтаксические расширения, которые позволяют определить в момент компиляции различные характеристики типа (или пары типов).
__has_nothrow_assign (type)-
Если
typeимеет квалификаторconstили является типом ссылки, то признак —false. В противном случае, если__has_trivial_assign (type)—true, то признак —true, иначе, еслиtype— cv-квалифицированный класс или тип объединения с операторами копирующей присваивания, которые, как известно, не выбрасывают исключения, то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __has_nothrow_copy (type)-
Если
__has_trivial_copy (type)—true, то признак —true, иначе, еслиtype— cv-квалифицированный класс или тип объединения с конструкторами копирования, которые, как известно, не выбрасывают исключения, то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __has_nothrow_constructor (type)-
Если
__has_trivial_constructor (type)—true, то признак —true, иначе, еслиtype— cv-класс или тип объединения (или массив того же) с конструктором по умолчанию, который, как известно, не выбрасывает исключения, то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __has_trivial_assign (type)-
Если
typeимеет квалификаторconstили является типом ссылки, то признак —false. В противном случае, если__is_pod (type)—true, то признак —true, иначе, еслиtype— cv-квалифицированный класс или тип объединения с тривиальным оператором копирующей присваивания ([class.copy]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __has_trivial_copy (type)-
Если
__is_pod (type)—trueилиtype— тип ссылки, то признак —true, иначе, еслиtype— cv-класс или тип объединения с тривиальным конструктором копирования ([class.copy]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __has_trivial_constructor (type)-
Если
__is_pod (type)—true, то признак —true, иначе, еслиtype— cv-квалифицированный класс или тип объединения (или массив того же) с тривиальным конструктором по умолчанию ([class.ctor]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __has_trivial_destructor (type)-
Если
__is_pod (type)—trueилиtype— тип ссылки, то признак —true, иначе, еслиtype— cv-класс или тип объединения (или массив того же) с тривиальным деструктором ([class.dtor]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __has_virtual_destructor (type)-
Если
type— класс с виртуальным деструктором ([class.dtor]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __is_abstract (type)-
Если
type— абстрактный класс ([class.abstract]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __is_base_of (base_type, derived_type)-
Если
base_type— базовый классderived_type([class.derived]), то признак —true, в противном случае —false. Верхние cv-квалификацииbase_typeиderived_typeигнорируются. Для целей этого признака тип класса рассматривается как собственный базовый класс. Требуется: если__is_class (base_type)и__is_class (derived_type)—trueиbase_typeиderived_typeне являются одним типом (не учитывая cv-квалификаторы), тоderived_typeдолжен быть полным типом. Если это требование не выполняется, генерируется диагностическое сообщение. __is_class (type)-
Если
type— cv-квалифицированный тип класса, и не тип объединения ([basic.compound]), то признак —true, иначе —false. __is_empty (type)-
Если
__is_class (type)—false, то признак —false. В противном случаеtypeсчитается пустым только если:typeне имеет нестатических данных членов, или все нестатические данные члены, если таковые имеются, являются битами длины 0, иtypeне имеет виртуальных членов, иtypeне имеет виртуальных базовых классов, иtypeне имеет базовых классовbase_type, для которых__is_empty (base_type)—false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __is_enum (type)-
Если
type— cv перечисление ([basic.compound]), то признак —true, иначе —false. __is_literal_type (type)-
Если
type— тип литерала ([basic.types]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __is_pod (type)-
Если
type— cv POD тип ([basic.types]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __is_polymorphic (type)-
Если
type— полиморфный класс ([class.virtual]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __is_standard_layout (type)-
Если
type— тип стандартной компоновки ([basic.types]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __is_trivial (type)-
Если
type— тривиальный тип ([basic.types]), то признак —true, иначе —false. Требуется:typeдолжен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестной размерности. __is_union (type)-
Если
type— cv тип объединения ([basic.compound]), то признак —true, иначе —false. __underlying_type (type)-
Базовый тип
type. Требуется:typeдолжен быть типом перечисления ([dcl.enum]). __integer_pack (length)-
При использовании в качестве шаблона расширения пакета в определении шаблона, расширяется до пакета аргументов шаблона, содержащих целые числа от
0доlength-1. Это обеспечит эффективную реализациюstd::make_integer_sequence.
Далее: C++ Концепции, Предыдущее: Функциональное многоверсионирование, Вверх: Расширения C++ [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/gcc/Type-Traits.html