std::has_unique_object_representations
Определён в заголовочном файле <type_traits> | ||
|---|---|---|
template< class T > struct has_unique_object_representations; | (начиная с C++17) |
std::has_unique_object_representations — это унарный типовой признак.
Если T является тривиально копируемым типом и любые два объекта типа T с одинаковым значением имеют одинаковое представление объекта, предоставляет константу-член value, равную true. Для любого другого типа value равно false.
Для целей этого типового признака два массива имеют одинаковое значение, если их элементы имеют одинаковые значения; два класса, не являющиеся объединениями, имеют одинаковое значение, если их непосредственные подобъекты имеют одинаковые значения; два объединения имеют одинаковое значение, если у них один и тот же активный член и значение этого члена одинаково.
Для скалярных типов, удовлетворяющих этому типовому признаку, поведение определяется реализацией, однако беззнаковые(до C++20) целочисленные типы, не использующие биты-заполнители, гарантированно имеют уникальные представления объектов.
Если std::remove_all_extents_t<T> является неполным типом, отличным от (возможно, cv-квалифицированного) void, поведение не определено.
Если программа добавляет специализации для std::has_unique_object_representations или std::has_unique_object_representations_v, поведение не определено.
Параметры шаблона
| T | - | тип для проверки |
Вспомогательный шаблон переменной
template< class T >
constexpr bool has_unique_object_representations_v =
has_unique_object_representations<T>::value;
| (начиная с C++17) |
Унаследовано от std::integral_constant
Константы-члены
|
value
[static] |
true, если T имеет уникальные представления объектов; в противном случае false (открытая статическая константа-член) |
Функции-члены
|
operator bool | преобразует объект в bool, возвращает value (открытая функция-член) |
|
operator()
(C++14) | возвращает value (открытая функция-член) |
Типы-члены
| Тип | Определение |
|---|---|
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()
{
// Every value of a char corresponds to exactly one object representation.
static_assert(std::has_unique_object_representations_v<char>);
// For IEC 559 floats, assertion passes because the value NaN has
// multiple object representations.
static_assert(!std::has_unique_object_representations_v<float>);
// Should succeed in any sane implementation because unpadded
// is typically not padded, and std::uint32_t cannot contain padding bits.
static_assert(std::has_unique_object_representations_v<unpadded>);
// Fails in most implementations because padding bits are inserted
// between the data members c and st for the purpose of aligning st to 16 bits.
static_assert(!std::has_unique_object_representations_v<likely_padded>);
// Notable architectural divergence:
static_assert(std::has_unique_object_representations_v<bool>); // x86
// static_assert(!std::has_unique_object_representations_v<bool>); // ARM
}
Отчёты об ошибках
Следующие отчёты об ошибках, изменяющие поведение, были применены задним числом к ранее опубликованным стандартам C++.
| Отчёт об ошибке | Применён к | Опубликованное поведение | Правильное поведение |
|---|---|---|---|
| LWG 4113 | C++17 |
T мог быть массивом неизвестной длиныдаже если его тип элемента был неполным | требовалось, чтобы тип элемента был полным |
См. также
|
(C++11) | проверяет, является ли тип типом стандартной компоновки (шаблон класса) |
|
(C++11) | объект-функция хеширования (шаблон класса) |
|
(C++26) | проверяет, влияет ли каждый бит представления объекта отражённого типа на его значение (функция) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/types/has_unique_object_representations