Характеристики типов (начиная с C++11)
Характеристики типов определяют основанные на шаблонах интерфейсы для получения сведений о свойствах типов во время компиляции.
Попытка специализировать шаблон, определённый в заголовке <type_traits> и перечисленный на этой странице, приводит к неопределённому поведению, за исключением того, что std::common_type и std::basic_common_reference(начиная с C++20) можно специализировать в соответствии с требованиями описания.
Шаблон, определённый в заголовке <type_traits>, можно инстанцировать с неполным типом, если не указано иное, несмотря на общий запрет на инстанцирование шаблонов стандартной библиотеки с неполными типами.
Базовые классы
Большинство не преобразующих типовых характеристик должны быть публично и однозначно производными от std::integral_constant, чтобы удовлетворять требованиям UnaryTypeTrait или BinaryTypeTrait.
Определено в заголовке <type_traits> |
|
|---|---|
|
(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> |
|
|---|---|
|
(C++11) | проверяет, является ли тип void (шаблон класса) |
|
(C++11)(DR*) | проверяет, является ли тип std::nullptr_t (шаблон класса) |
|
(C++26) | проверяет, является ли тип std::meta::info (шаблон класса) |
|
(C++11) | проверяет, является ли тип целочисленным (шаблон класса) |
|
(C++11) | проверяет, является ли тип типом с плавающей точкой (шаблон класса) |
|
(C++11) | проверяет, является ли тип массивом (шаблон класса) |
|
(C++11) | проверяет, является ли тип перечислением (шаблон класса) |
|
(C++11) | проверяет, является ли тип объединением (шаблон класса) |
|
(C++11) | проверяет, является ли тип классом, не являющимся объединением (шаблон класса) |
|
(C++11) | проверяет, является ли тип типом функции (шаблон класса) |
|
(C++11) | проверяет, является ли тип типом указателя (шаблон класса) |
|
(C++11) | проверяет, является ли тип ссылкой на lvalue (шаблон класса) |
|
(C++11) | проверяет, является ли тип ссылкой на rvalue (шаблон класса) |
|
(C++11) | проверяет, является ли тип указателем на нестатический член-объект (шаблон класса) |
|
(C++11) | проверяет, является ли тип указателем на нестатическую функцию-член (шаблон класса) |
Составные категории типов |
|
Определено в заголовке <type_traits> |
|
|
(C++11) | проверяет, является ли тип фундаментальным (шаблон класса) |
|
(C++11) | проверяет, является ли тип арифметическим (шаблон класса) |
|
(C++11) | проверяет, является ли тип скалярным (шаблон класса) |
|
(C++11) | проверяет, является ли тип объектным (шаблон класса) |
|
(C++11) | проверяет, является ли тип составным (шаблон класса) |
|
(C++11) | проверяет, является ли тип ссылкой на lvalue или ссылкой на rvalue (шаблон класса) |
|
(C++11) | проверяет, является ли тип указателем на нестатическую функцию-член или член-объект (шаблон класса) |
Свойства типов |
|
Определено в заголовке <type_traits> |
|
|
(C++11) | проверяет, имеет ли тип квалификатор const (шаблон класса) |
|
(C++11) | проверяет, имеет ли тип квалификатор volatile (шаблон класса) |
|
(C++11)(устарело в C++26) | проверяет, является ли тип тривиальным (шаблон класса) |
|
(C++11) | проверяет, является ли тип тривиально копируемым (шаблон класса) |
|
(C++11) | проверяет, является ли тип типом со стандартным размещением (шаблон класса) |
|
(C++11)(устарело в C++20) | проверяет, является ли тип типом данных старого образца (POD) (шаблон класса) |
|
(C++11)(устарело в C++17)(удалено в C++20) | проверяет, является ли тип литеральным (шаблон класса) |
|
(C++17) | проверяет, влияет ли каждый бит объектного представления типа на его значение (шаблон класса) |
|
(C++11) | проверяет, является ли тип классом (но не объединением) и не имеет ли он нестатических членов данных (шаблон класса) |
|
(C++11) | проверяет, является ли тип полиморфным типом класса (шаблон класса) |
|
(C++11) | проверяет, является ли тип абстрактным типом класса (шаблон класса) |
|
(C++14) | проверяет, является ли тип конечным типом класса (шаблон класса) |
|
(C++17) | проверяет, является ли тип агрегатным (шаблон класса) |
|
(C++26) | проверяет, является ли тип структурным (шаблон класса) |
|
(C++23) | проверяет, является ли тип типом с неявным временем жизни (шаблон класса) |
|
(C++11) | проверяет, является ли тип знаковым арифметическим типом (шаблон класса) |
|
(C++11) | проверяет, является ли тип беззнаковым арифметическим типом (шаблон класса) |
|
(C++20) | проверяет, является ли тип массивом с известной границей (шаблон класса) |
|
(C++20) | проверяет, является ли тип массивом с неизвестной границей (шаблон класса) |
|
(C++23) | проверяет, является ли тип перечислением с ограниченной областью видимости (шаблон класса) |
Поддерживаемые операции |
|
Определено в заголовке <type_traits> |
|
|---|---|
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип конструктор для заданных аргументов (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип конструктор по умолчанию (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип конструктор копирования (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, можно ли сконструировать тип из ссылки на rvalue (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип оператор присваивания для заданного аргумента (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип оператор копирующего присваивания (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип оператор перемещающего присваивания (шаблон класса) |
|
(C++11)(C++11)(C++11) | проверяет, имеет ли тип неудалённый деструктор (шаблон класса) |
|
(C++11) | проверяет, имеет ли тип виртуальный деструктор (шаблон класса) |
|
(C++17)(C++17)(C++17)(C++17) | проверяет, можно ли обменивать объекты типа на объекты того же или другого типа (шаблон класса) |
|
(C++23) | проверяет, привязывается ли ссылка к временному объекту при прямой инициализации (шаблон класса) |
|
(C++23) | проверяет, привязывается ли ссылка к временному объекту при копирующей инициализации (шаблон класса) |
Запросы свойств
Характеристики-запросы свойств можно использовать для получения целочисленных свойств типа во время компиляции.
Все эти характеристики типов удовлетворяют требованиям UnaryTypeTrait; базовой характеристикой каждой из них является std::integral_constant<std::size_t,Value>, где Value — результат запроса соответствующего свойства.
Определено в заголовке <type_traits> |
|
|---|---|
|
(C++11) | получает требования типа к выравниванию (шаблон класса) |
|
(C++11) | получает количество измерений типа массива (шаблон класса) |
|
(C++11) | получает размер типа массива вдоль заданного измерения (шаблон класса) |
Отношения между типами
Характеристики отношений между типами можно использовать для проверки отношений между типами во время компиляции.
Все эти характеристики типов удовлетворяют требованиям BinaryTypeTrait; базовой характеристикой каждой из них является либо std::true_type, либо std::false_type — в зависимости от того, выполняется ли соответствующее условие.
Определено в заголовочном файле <type_traits> |
|
|---|---|
|
(C++11) | проверяет, являются ли два типа одинаковыми (шаблон класса) |
|
(C++11) | проверяет, является ли один тип базовым для другого типа (шаблон класса) |
|
(C++26) | проверяет, является ли один тип виртуальным базовым для другого типа (шаблон класса) |
|
(C++11)(C++20) | проверяет, можно ли преобразовать один тип в другой (шаблон класса) |
|
(C++20) | проверяет, являются ли два типа совместимыми по компоновке (шаблон класса) |
|
(C++20) | проверяет, является ли один тип взаимно преобразуемым по указателю (начальным) базовым типом другого типа (шаблон класса) |
|
(C++17)(C++17)(C++17)(C++17) | проверяет, можно ли вызвать тип (как если бы это делалось с помощью std::invoke) с заданными типами аргументов (шаблон класса) |
Преобразования типов
Средства преобразования типов преобразуют один тип в другой согласно некоторым заранее заданным правилам.
Все эти типовые характеристики удовлетворяют требованиям TransformationTrait.
Квалификаторы const и volatile |
|
Определено в заголовочном файле <type_traits> |
|
|---|---|
|
(C++11)(C++11)(C++11) | удаляет квалификаторы const и/или volatile из заданного типа (шаблон класса) |
|
(C++11)(C++11)(C++11) | добавляет к заданному типу квалификаторы const и/или volatile (шаблон класса) |
Ссылки |
|
Определено в заголовочном файле <type_traits> |
|
|
(C++11) | удаляет ссылку из заданного типа (шаблон класса) |
|
(C++11)(C++11) | добавляет к заданному типу ссылку на lvalue или rvalue (шаблон класса) |
Модификаторы знака |
|
Определено в заголовочном файле <type_traits> |
|
|
(C++11) | получает соответствующий тип со знаком для заданного целочисленного типа (шаблон класса) |
|
(C++11) | получает соответствующий беззнаковый тип для заданного целочисленного типа (шаблон класса) |
Массивы |
|
Определено в заголовочном файле <type_traits> |
|
|
(C++11) | удаляет один уровень размерности из заданного типа массива (шаблон класса) |
|
(C++11) | удаляет все уровни размерности из заданного типа массива (шаблон класса) |
Указатели |
|
Определено в заголовочном файле <type_traits> |
|
|
(C++11) | удаляет указатель из заданного типа (шаблон класса) |
|
(C++11) | добавляет указатель к заданному типу (шаблон класса) |
Другие преобразования |
|
Определено в заголовочном файле <type_traits> |
|
|
(начиная с C++11)(устарело в C++23) | определяет тип, пригодный для использования в качестве неинициализированного хранилища для объектов заданного размера (шаблон класса) |
|
(начиная с C++11)(устарело в C++23) | определяет тип, пригодный для использования в качестве неинициализированного хранилища для всех заданных типов (шаблон класса) |
|
(C++11) | применяет преобразования типов, как при передаче аргумента функции по значению (шаблон класса) |
|
(C++20) | объединяет std::remove_cv и std::remove_reference (шаблон класса) |
|
(C++11) | условно исключает перегрузку функции или специализацию шаблона из разрешения перегрузки (шаблон класса) |
|
(C++11) | выбирает один из двух типов на основе логического значения, известного во время компиляции (шаблон класса) |
|
(C++11) | определяет общий тип для группы типов (шаблон класса) |
|
(C++20) | определяет общий ссылочный тип для группы типов (шаблон класса) |
|
(C++11) | получает базовый целочисленный тип для заданного типа перечисления (шаблон класса) |
|
(C++11)(удалено в C++20)(C++17) | выводит тип результата вызова вызываемого объекта с набором аргументов (шаблон класса) |
|
(C++17) | вариативный псевдонидный шаблон типа void (псевдонидный шаблон) |
|
(C++20) | возвращает аргумент типа без изменений (шаблон класса) |
Логические операции (начиная с C++17)
Средства логических операций применяют логические операторы к другим типовым характеристикам.
Определено в заголовочном файле <type_traits> |
|
|---|---|
|
(C++17) | вариативная метафункция логического И (шаблон класса) |
|
(C++17) | вариативная метафункция логического ИЛИ (шаблон класса) |
|
(C++17) | метафункция логического НЕ (шаблон класса) |
Связи между членами (начиная с C++20)
Определено в заголовочном файле <type_traits> |
|
|---|---|
|
(C++20) | проверяет, являются ли объекты типа взаимно преобразуемыми по указателю с указанным подобъектом этого типа (шаблон функции) |
|
(C++20) | проверяет, соответствуют ли друг другу два указанных члена в общей начальной подпоследовательности двух заданных типов (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/type_traits