std::has_unique_object_representations
Определено в заголовочном файле <type_traits> | ||
template<class T > struct has_unique_object_representations; | (начиная с C++17) | |
std::has_unique_object_representations
является UnaryTypeTrait.
Если T
является TriviallyCopyable и любые два объекта типа T
с одинаковым значением имеют одинаковое представление объекта, предоставляет константу элемент value
, равную true. Для любого другого типа value
равна false.
Для целей этого свойства два массива имеют одинаковое значение, если их элементы имеют одинаковые значения, два класса не объединения имеют одно и то же значение, если их непосредственные подобъекты имеют одинаковое значение, и два объединения имеют одно и то же значение, если они имеют один и тот же активный элемент, и значения этих элементов одинаковые.
То, какие скалярные типы соответствуют этому свойству, определяется реализацией, но целые беззнаковые(до C++20) типы, которые не используют биты заполнения, гарантированно будут иметь уникальные представления объектов.
Поведение не определено, если T
является неполным типом, отличным от (возможно, cv-квалифицированного) void или массивом с неизвестной границей.
Поведение программы, добавляющей специализации для std::has_unique_object_representations
или std::has_unique_object_representations_v
не определено.
Содержание |
[править]Параметры шаблона
T | — | тип для проверки |
[править]Шаблон вспомогательной переменной
template<class T > inlineconstexprbool has_unique_object_representations_v = | (начиная с C++17) | |
Унаследован от std::integral_constant
Константы элементы
value [static] | true, если T имеет уникальные представления объектов, false иначе (public static константа-элемент) |
Функции-элементы
operator bool | преобразует объект в bool, возвращает value (public функция-элемент) |
operator() (C++14) | возвращает value (public функция-элемент) |
Типы элементы
Тип | Определение |
value_type | bool |
type | std::integral_constant<bool, value> |
[править]Примечание
Это свойство было введено, чтобы можно было определить, можно ли правильно хешировать тип, хэшируя его объектное представление в виде массива байтов.
Макрос Тестирования функциональности | Значение | Стандарт | Функциональность |
---|---|---|---|
__cpp_lib_has_unique_object_representations | 201606L | (C++17) | std::has_unique_object_representations |
[править]Пример
#include <cstdint>#include <type_traits> struct unpadded {std::uint32_t a, b;}; struct likely_padded {std::uint8_t c;std::uint16_t st;std::uint32_t i;}; int main(){// Каждое значение char соответствует ровно одному представлению объекта. static_assert(std::has_unique_object_representations_v<char>);// Для чисел с плавающей запятой IEC 559 утверждение проходит,// поскольку значение NaN имеет несколько объектных представлений static_assert(!std::has_unique_object_representations_v<float>); // Должно быть успешным в любой разумной реализации, поскольку unpadded// обычно не дополняется, а std::uint32_t не может содержать биты заполнения. static_assert(std::has_unique_object_representations_v<unpadded>);// В большинстве реализаций происходит сбой, поскольку между элементами данных// c и st вставляются биты заполнения с целью выравнивания st по 16 битам. static_assert(!std::has_unique_object_representations_v<likely_padded>); // Заметное архитектурное расхождение: static_assert(std::has_unique_object_representations_v<bool>);// x86// static_assert(!std::has_unique_object_representations_v<bool>); // ARM}
[править]Смотрите также
(C++11) | проверяет, является ли тип типом со стандартной компоновкой (шаблон класса) |
(C++11) | Объект хеш-функции (шаблон класса) |