Пространства имён
Варианты
Действия

std::has_unique_object_representations

Материал из cppreference.com
< cpp‎ | types
 
 
Библиотека метапрограммирования
Свойства типов
Категории типов
(C++11)
(C++14)  
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
Свойства типов
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(до C++20*)
(C++11)(устарело в C++20)
(C++11)
has_unique_object_representations
(C++17)
Константы свойств типа
Метафункции
(C++17)
Поддерживаемые операции
Запросы отношений и свойств
Модификации типов
Преобразования типов
(C++11)(устарело в C++23)
(C++11)(устарело в C++23)
(C++11)
(C++11)
(C++17)

(C++11)(до C++20*)(C++17)
Рациональная арифметика времени компиляции
Целочисленные последовательности времени компиляции
 
Определено в заголовочном файле <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 =

    has_unique_object_representations<T>::value;
(начиная с C++17)

Унаследован от std::integral_constant

Константы элементы

value
[static]
true, если T имеет уникальные представления объектов, false иначе
(public static константа-элемент)

Функции-элементы

operator bool
преобразует объект в bool, возвращает value
(public функция-элемент)
operator()
(C++14)
возвращает value
(public функция-элемент)

Типы элементы

Тип Определение
value_typebool
typestd::integral_constant<bool, value>

[править]Примечание

Это свойство было введено, чтобы можно было определить, можно ли правильно хешировать тип, хэшируя его объектное представление в виде массива байтов.

Макрос Тестирования функциональностиЗначениеСтандартФункциональность
__cpp_lib_has_unique_object_representations201606L(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)
Объект хеш-функции
(шаблон класса)[править]
close