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