7.10 Типы-признаки
Передняя часть 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]).
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Type-Traits.html