7.9 Тракты типов
Фронтенд C++ реализует синтаксические расширения, которые позволяют определять во время компиляции различные характеристики типа (или пары типов).
-
Встроенная функция:
bool__has_nothrow_assign(type) Если type является
const-квалифицированным или является ссылочным типом, то признак являетсяfalse. В противном случае, если__has_trivial_assign (type)являетсяtrue, то признак являетсяtrue, иначе, если type является cv-квалифицированным типом класса или объединения с операторами присваивания копирования, которые, как известно, не вызывают исключения, то признак являетсяtrue, иначе он являетсяfalse. Требуется: type должен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестного размера.
-
Встроенная функция:
bool__has_nothrow_copy(type) Если
__has_trivial_copy (type)являетсяtrue, то признак являетсяtrue, иначе, если type является cv-квалифицированным типом класса или объединения с конструкторами копирования, которые, как известно, не вызывают исключения, то признак являетсяtrue, иначе он являетсяfalse. Требуется: type должен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестного размера.
-
Встроенная функция:
bool__has_nothrow_constructor(type) Если
__has_trivial_constructor (type)являетсяtrue, то признак являетсяtrue, иначе, если type является cv-классом или типом объединения (или массивом таковых) с конструктором по умолчанию, который, как известно, не вызывает исключения, то признак являетсяtrue, иначе он являетсяfalse. Требуется: type должен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестного размера.
-
Встроенная функция:
bool__has_trivial_assign(type) Если type является
const-квалифицированным или является ссылочным типом, то признак являетсяfalse. В противном случае, если__is_trivial (type)являетсяtrue, то признак являетсяtrue, иначе, если type является cv-квалифицированным типом класса или объединения с тривиальным присваиванием копирования ([class.copy]), то признак являетсяtrue, иначе он являетсяfalse. Требуется: type должен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестного размера.
-
Встроенная функция:
bool__has_trivial_copy(type) Если
__is_trivial (type)являетсяtrueили type является ссылочным типом, то признак являетсяtrue, иначе, если type является cv-классом или типом объединения с тривиальным конструктором копирования ([class.copy]), то признак являетсяtrue, иначе он являетсяfalse. Требуется: type должен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестного размера.
-
Встроенная функция:
bool__has_trivial_constructor(type) Если
__is_trivial (type)являетсяtrue, то признак являетсяtrue, иначе, если type является cv-квалифицированным типом класса или объединения (или массивом таковых) с тривиальным конструктором по умолчанию ([class.ctor]), то признак являетсяtrue, иначе он являетсяfalse. Требуется: type должен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестного размера.
-
Встроенная функция:
bool__has_trivial_destructor(type) Если
__is_trivial (type)являетсяtrueили type является ссылочным типом, то признак являетсяtrue, иначе, если type является cv-классом или типом объединения (или массивом таковых) с тривиальным деструктором ([class.dtor]), то признак являетсяtrue, иначе он являетсяfalse. Требуется: type должен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестного размера.
-
Встроенная функция:
bool__has_virtual_destructor(type) Если type является типом класса с виртуальным деструктором ([class.dtor]), то признак является
true, иначе он являетсяfalse. Требуется: Если type является не-объединением типа класса, он должен быть полным типом.
-
Встроенная функция:
bool__is_abstract(type) Если type является абстрактным классом ([class.abstract]), то признак является
true, иначе он являетсяfalse. Требуется: Если type является не-объединением типа класса, он должен быть полным типом.
-
Встроенная функция:
bool__is_aggregate(type) Если type является агрегатным типом ([dcl.init.aggr]), то признак является
true, иначе он являетсяfalse. Требуется: Если type является типом класса, он должен быть полным типом.
-
Встроенная функция:
bool__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 должен быть полным типом. Диагностика создаётся, если это требование не выполняется.
-
Встроенная функция:
bool__is_class(type) Если type является cv-квалифицированным типом класса и не является типом объединения ([basic.compound]), то признак является
true, иначе он являетсяfalse.
-
Встроенная функция:
bool__is_empty(type) Если
__is_class (type)являетсяfalse, то признак являетсяfalse. В противном случае type считается пустым тогда и только тогда, когда: type не имеет нестатических членов данных, или все нестатические члены данных, если таковые имеются, являются битовыми полями длиной 0, и type не имеет виртуальных членов, и type не имеет виртуальных базовых классов, и type не имеет базовых классов base_type, для которых__is_empty (base_type)являетсяfalse. Требуется: Если type является не-объединением типа класса, он должен быть полным типом.
-
Встроенная функция:
bool__is_enum(type) Если type является cv-перечислимым типом ([basic.compound]), то признак является
true, иначе он являетсяfalse.
-
Встроенная функция:
bool__is_final(type) Если type является типом класса или объединения, помеченным
final, то признак являетсяtrue, иначе он являетсяfalse. Требуется: Если type является типом класса, он должен быть полным типом.
-
Встроенная функция:
bool__is_literal_type(type) Если type является литеральным типом ([basic.types]), то признак является
true, иначе он являетсяfalse. Требуется: type должен быть полным типом, (возможно, cv-квалифицированным)void, или массивом неизвестного размера.
-
Встроенная функция:
bool__is_pod(type) Если type — тип cv POD ([basic.types]), то признак равен
true, в противном случае —false. Требуется: type должен быть полным типом (возможно, с cv-квалификаторами)void, или массивом с неизвестной границей.
-
Встроенная функция:
bool__is_polymorphic(type) Если type — полиморфный класс ([class.virtual]), то признак равен
true, в противном случае —false. Требуется: Если type — тип класса (не union), он должен быть полным типом.
-
Встроенная функция:
bool__is_standard_layout(type) Если type — тип со стандартной структурой ([basic.types]), то признак равен
true, в противном случае —false. Требуется: type должен быть полным типом, массивом полных типов или (возможно, с cv-квалификаторами)void.
-
Встроенная функция:
bool__is_trivial(type) Если type — тривиальный тип ([basic.types]), то признак равен
true, в противном случае —false. Требуется: type должен быть полным типом, массивом полных типов или (возможно, с cv-квалификаторами)void.
-
Встроенная функция:
bool__is_union(type) Если type — тип cv union ([basic.compound]), то признак равен
true, в противном случае —false.
-
Встроенная функция:
bool__underlying_type(type) Базовый тип type. Требуется: type должен быть типом перечисления ([dcl.enum]).
-
Встроенная функция:
bool__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-13.3.0/gcc/Type-Traits.html