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