std:: has_unique_object_representations
|
Определено в заголовочном файле
<type_traits>
|
||
|
template
<
class
T
>
struct has_unique_object_representations ; |
(начиная с C++17) | |
std::has_unique_object_representations
является
UnaryTypeTrait
.
Если
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
=
|
(начиная с C++17) | |
Наследуется от std:: integral_constant
Константы-члены
|
value
[static]
|
true
если
T
имеет уникальные представления объектов,
false
в противном случае
(public static member constant) |
Функции-члены
|
operator bool
|
преобразует объект в
bool
, возвращает
value
(public member function) |
|
operator()
(C++14)
|
возвращает
value
(public member function) |
Типы-члены
| Тип | Определение |
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++.
| DR | Applied to | Behavior as published | Correct behavior |
|---|---|---|---|
| LWG 4113 | C++17 |
T
может быть массивом неизвестной границы
даже если его тип элемента неполный |
требуется, чтобы тип элемента
был полным |
Смотрите также
|
(C++11)
|
проверяет, является ли тип
стандартным размещением
(шаблон класса) |
|
(C++11)
|
функциональный объект хеш-функции
(шаблон класса) |