Spec-Zone.ru › GCC 9

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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API