Spec-Zone.ru › C++

Характеристики типов (начиная с C++11)

Характеристики типов определяют основанные на шаблонах интерфейсы для получения сведений о свойствах типов во время компиляции.

Попытка специализировать шаблон, определённый в заголовке <type_traits> и перечисленный на этой странице, приводит к неопределённому поведению, за исключением того, что std::common_type и std::basic_common_reference(начиная с C++20) можно специализировать в соответствии с требованиями описания.

Шаблон, определённый в заголовке <type_traits>, можно инстанцировать с неполным типом, если не указано иное, несмотря на общий запрет на инстанцирование шаблонов стандартной библиотеки с неполными типами.

Базовые классы

Большинство не преобразующих типовых характеристик должны быть публично и однозначно производными от std::integral_constant, чтобы удовлетворять требованиям UnaryTypeTrait или BinaryTypeTrait.

Определено в заголовке <type_traits>
integral_constantbool_constant
(C++11)(C++17)
константа времени компиляции заданного типа с заданным значением
(шаблон класса)

Для типа bool предусмотрены две специализации std::integral_constant:

Определено в заголовке <type_traits>
Тип Определение
true_type std::integral_constant<bool,true>
false_type std::integral_constant<bool,false>

Унарные характеристики типов

Унарные характеристики типов можно использовать для получения логических свойств типа во время компиляции.

Все эти характеристики типов удовлетворяют требованиям UnaryTypeTrait; базовой характеристикой каждой из них является либо std::true_type, либо std::false_type — в зависимости от того, выполняется ли соответствующее условие.

Основные категории типов
Определено в заголовке <type_traits>
is_void
(C++11)
проверяет, является ли тип void
(шаблон класса)
is_null_pointer
(C++11)(DR*)
проверяет, является ли тип std::nullptr_t
(шаблон класса)
is_reflection
(C++26)
проверяет, является ли тип std::meta::info
(шаблон класса)
is_integral
(C++11)
проверяет, является ли тип целочисленным
(шаблон класса)
is_floating_point
(C++11)
проверяет, является ли тип типом с плавающей точкой
(шаблон класса)
is_array
(C++11)
проверяет, является ли тип массивом
(шаблон класса)
is_enum
(C++11)
проверяет, является ли тип перечислением
(шаблон класса)
is_union
(C++11)
проверяет, является ли тип объединением
(шаблон класса)
is_class
(C++11)
проверяет, является ли тип классом, не являющимся объединением
(шаблон класса)
is_function
(C++11)
проверяет, является ли тип типом функции
(шаблон класса)
is_pointer
(C++11)
проверяет, является ли тип типом указателя
(шаблон класса)
is_lvalue_reference
(C++11)
проверяет, является ли тип ссылкой на lvalue
(шаблон класса)
is_rvalue_reference
(C++11)
проверяет, является ли тип ссылкой на rvalue
(шаблон класса)
is_member_object_pointer
(C++11)
проверяет, является ли тип указателем на нестатический член-объект
(шаблон класса)
is_member_function_pointer
(C++11)
проверяет, является ли тип указателем на нестатическую функцию-член
(шаблон класса)
Составные категории типов
Определено в заголовке <type_traits>
is_fundamental
(C++11)
проверяет, является ли тип фундаментальным
(шаблон класса)
is_arithmetic
(C++11)
проверяет, является ли тип арифметическим
(шаблон класса)
is_scalar
(C++11)
проверяет, является ли тип скалярным
(шаблон класса)
is_object
(C++11)
проверяет, является ли тип объектным
(шаблон класса)
is_compound
(C++11)
проверяет, является ли тип составным
(шаблон класса)
is_reference
(C++11)
проверяет, является ли тип ссылкой на lvalue или ссылкой на rvalue
(шаблон класса)
is_member_pointer
(C++11)
проверяет, является ли тип указателем на нестатическую функцию-член или член-объект
(шаблон класса)
Свойства типов
Определено в заголовке <type_traits>
is_const
(C++11)
проверяет, имеет ли тип квалификатор const
(шаблон класса)
is_volatile
(C++11)
проверяет, имеет ли тип квалификатор volatile
(шаблон класса)
is_trivial
(C++11)(устарело в C++26)
проверяет, является ли тип тривиальным
(шаблон класса)
is_trivially_copyable
(C++11)
проверяет, является ли тип тривиально копируемым
(шаблон класса)
is_standard_layout
(C++11)
проверяет, является ли тип типом со стандартным размещением
(шаблон класса)
is_pod
(C++11)(устарело в C++20)
проверяет, является ли тип типом данных старого образца (POD)
(шаблон класса)
is_literal_type
(C++11)(устарело в C++17)(удалено в C++20)
проверяет, является ли тип литеральным
(шаблон класса)
has_unique_object_representations
(C++17)
проверяет, влияет ли каждый бит объектного представления типа на его значение
(шаблон класса)
is_empty
(C++11)
проверяет, является ли тип классом (но не объединением) и не имеет ли он нестатических членов данных
(шаблон класса)
is_polymorphic
(C++11)
проверяет, является ли тип полиморфным типом класса
(шаблон класса)
is_abstract
(C++11)
проверяет, является ли тип абстрактным типом класса
(шаблон класса)
is_final
(C++14)
проверяет, является ли тип конечным типом класса
(шаблон класса)
is_aggregate
(C++17)
проверяет, является ли тип агрегатным
(шаблон класса)
is_structural
(C++26)
проверяет, является ли тип структурным
(шаблон класса)
is_implicit_lifetime
(C++23)
проверяет, является ли тип типом с неявным временем жизни
(шаблон класса)
is_signed
(C++11)
проверяет, является ли тип знаковым арифметическим типом
(шаблон класса)
is_unsigned
(C++11)
проверяет, является ли тип беззнаковым арифметическим типом
(шаблон класса)
is_bounded_array
(C++20)
проверяет, является ли тип массивом с известной границей
(шаблон класса)
is_unbounded_array
(C++20)
проверяет, является ли тип массивом с неизвестной границей
(шаблон класса)
is_scoped_enum
(C++23)
проверяет, является ли тип перечислением с ограниченной областью видимости
(шаблон класса)
Поддерживаемые операции
Определено в заголовке <type_traits>
is_constructibleis_trivially_constructibleis_nothrow_constructible
(C++11)(C++11)(C++11)
проверяет, имеет ли тип конструктор для заданных аргументов
(шаблон класса)
is_default_constructibleis_trivially_default_constructibleis_nothrow_default_constructible
(C++11)(C++11)(C++11)
проверяет, имеет ли тип конструктор по умолчанию
(шаблон класса)
is_copy_constructibleis_trivially_copy_constructibleis_nothrow_copy_constructible
(C++11)(C++11)(C++11)
проверяет, имеет ли тип конструктор копирования
(шаблон класса)
is_move_constructibleis_trivially_move_constructibleis_nothrow_move_constructible
(C++11)(C++11)(C++11)
проверяет, можно ли сконструировать тип из ссылки на rvalue
(шаблон класса)
is_assignableis_trivially_assignableis_nothrow_assignable
(C++11)(C++11)(C++11)
проверяет, имеет ли тип оператор присваивания для заданного аргумента
(шаблон класса)
is_copy_assignableis_trivially_copy_assignableis_nothrow_copy_assignable
(C++11)(C++11)(C++11)
проверяет, имеет ли тип оператор копирующего присваивания
(шаблон класса)
is_move_assignableis_trivially_move_assignableis_nothrow_move_assignable
(C++11)(C++11)(C++11)
проверяет, имеет ли тип оператор перемещающего присваивания
(шаблон класса)
is_destructibleis_trivially_destructibleis_nothrow_destructible
(C++11)(C++11)(C++11)
проверяет, имеет ли тип неудалённый деструктор
(шаблон класса)
has_virtual_destructor
(C++11)
проверяет, имеет ли тип виртуальный деструктор
(шаблон класса)
is_swappable_withis_swappableis_nothrow_swappable_withis_nothrow_swappable
(C++17)(C++17)(C++17)(C++17)
проверяет, можно ли обменивать объекты типа на объекты того же или другого типа
(шаблон класса)
reference_constructs_from_temporary
(C++23)
проверяет, привязывается ли ссылка к временному объекту при прямой инициализации
(шаблон класса)
reference_converts_from_temporary
(C++23)
проверяет, привязывается ли ссылка к временному объекту при копирующей инициализации
(шаблон класса)

Запросы свойств

Характеристики-запросы свойств можно использовать для получения целочисленных свойств типа во время компиляции.

Все эти характеристики типов удовлетворяют требованиям UnaryTypeTrait; базовой характеристикой каждой из них является std::integral_constant<std::size_t,Value>, где Value — результат запроса соответствующего свойства.

Определено в заголовке <type_traits>
alignment_of
(C++11)
получает требования типа к выравниванию
(шаблон класса)
rank
(C++11)
получает количество измерений типа массива
(шаблон класса)
extent
(C++11)
получает размер типа массива вдоль заданного измерения
(шаблон класса)

Отношения между типами

Характеристики отношений между типами можно использовать для проверки отношений между типами во время компиляции.

Все эти характеристики типов удовлетворяют требованиям BinaryTypeTrait; базовой характеристикой каждой из них является либо std::true_type, либо std::false_type — в зависимости от того, выполняется ли соответствующее условие.

Определено в заголовочном файле <type_traits>
is_same
(C++11)
проверяет, являются ли два типа одинаковыми
(шаблон класса)
is_base_of
(C++11)
проверяет, является ли один тип базовым для другого типа
(шаблон класса)
is_virtual_base_of
(C++26)
проверяет, является ли один тип виртуальным базовым для другого типа
(шаблон класса)
is_convertibleis_nothrow_convertible
(C++11)(C++20)
проверяет, можно ли преобразовать один тип в другой
(шаблон класса)
is_layout_compatible
(C++20)
проверяет, являются ли два типа совместимыми по компоновке
(шаблон класса)
is_pointer_interconvertible_base_of
(C++20)
проверяет, является ли один тип взаимно преобразуемым по указателю (начальным) базовым типом другого типа
(шаблон класса)
is_invocableis_invocable_ris_nothrow_invocableis_nothrow_invocable_r
(C++17)(C++17)(C++17)(C++17)
проверяет, можно ли вызвать тип (как если бы это делалось с помощью std::invoke) с заданными типами аргументов
(шаблон класса)

Преобразования типов

Средства преобразования типов преобразуют один тип в другой согласно некоторым заранее заданным правилам.

Все эти типовые характеристики удовлетворяют требованиям TransformationTrait.

Квалификаторы const и volatile
Определено в заголовочном файле <type_traits>
remove_cvremove_constremove_volatile
(C++11)(C++11)(C++11)
удаляет квалификаторы const и/или volatile из заданного типа
(шаблон класса)
add_cvadd_constadd_volatile
(C++11)(C++11)(C++11)
добавляет к заданному типу квалификаторы const и/или volatile
(шаблон класса)
Ссылки
Определено в заголовочном файле <type_traits>
remove_reference
(C++11)
удаляет ссылку из заданного типа
(шаблон класса)
add_lvalue_referenceadd_rvalue_reference
(C++11)(C++11)
добавляет к заданному типу ссылку на lvalue или rvalue
(шаблон класса)
Модификаторы знака
Определено в заголовочном файле <type_traits>
make_signed
(C++11)
получает соответствующий тип со знаком для заданного целочисленного типа
(шаблон класса)
make_unsigned
(C++11)
получает соответствующий беззнаковый тип для заданного целочисленного типа
(шаблон класса)
Массивы
Определено в заголовочном файле <type_traits>
remove_extent
(C++11)
удаляет один уровень размерности из заданного типа массива
(шаблон класса)
remove_all_extents
(C++11)
удаляет все уровни размерности из заданного типа массива
(шаблон класса)
Указатели
Определено в заголовочном файле <type_traits>
remove_pointer
(C++11)
удаляет указатель из заданного типа
(шаблон класса)
add_pointer
(C++11)
добавляет указатель к заданному типу
(шаблон класса)
Другие преобразования
Определено в заголовочном файле <type_traits>
aligned_storage
(начиная с C++11)(устарело в C++23)
определяет тип, пригодный для использования в качестве неинициализированного хранилища для объектов заданного размера
(шаблон класса)
aligned_union
(начиная с C++11)(устарело в C++23)
определяет тип, пригодный для использования в качестве неинициализированного хранилища для всех заданных типов
(шаблон класса)
decay
(C++11)
применяет преобразования типов, как при передаче аргумента функции по значению
(шаблон класса)
remove_cvref
(C++20)
объединяет std::remove_cv и std::remove_reference
(шаблон класса)
enable_if
(C++11)
условно исключает перегрузку функции или специализацию шаблона из разрешения перегрузки
(шаблон класса)
conditional
(C++11)
выбирает один из двух типов на основе логического значения, известного во время компиляции
(шаблон класса)
common_type
(C++11)
определяет общий тип для группы типов
(шаблон класса)
common_referencebasic_common_reference
(C++20)
определяет общий ссылочный тип для группы типов
(шаблон класса)
underlying_type
(C++11)
получает базовый целочисленный тип для заданного типа перечисления
(шаблон класса)
result_ofinvoke_result
(C++11)(удалено в C++20)(C++17)
выводит тип результата вызова вызываемого объекта с набором аргументов
(шаблон класса)
void_t
(C++17)
вариативный псевдонидный шаблон типа void
(псевдонидный шаблон)
type_identity
(C++20)
возвращает аргумент типа без изменений
(шаблон класса)

Логические операции (начиная с C++17)

Средства логических операций применяют логические операторы к другим типовым характеристикам.

Определено в заголовочном файле <type_traits>
conjunction
(C++17)
вариативная метафункция логического И
(шаблон класса)
disjunction
(C++17)
вариативная метафункция логического ИЛИ
(шаблон класса)
negation
(C++17)
метафункция логического НЕ
(шаблон класса)

Связи между членами (начиная с C++20)

Определено в заголовочном файле <type_traits>
is_pointer_interconvertible_with_class
(C++20)
проверяет, являются ли объекты типа взаимно преобразуемыми по указателю с указанным подобъектом этого типа
(шаблон функции)
is_corresponding_member
(C++20)
проверяет, соответствуют ли друг другу два указанных члена в общей начальной подпоследовательности двух заданных типов
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/type_traits

Spec-Zone.ru

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