std::meta::has_unique_object_representations
Определено в заголовочном файле <meta> | ||
|---|---|---|
consteval bool has_unique_object_representations( std::meta::info r ); | (начиная с C++26) |
Возвращает true, если r представляет собой тривиально копируемый тип T и любые два объекта типа T с одинаковым значением имеют одинаковое представление объекта. Для любого другого типа T возвращает false.
Для целей этой метафункции два массива имеют одинаковое значение, если значения их элементов совпадают; два не являющихся объединениями классов имеют одинаковое значение, если значения их непосредственных подобъектов совпадают; два объединения имеют одинаковое значение, если у них совпадает активный член и значение этого члена.
Для скалярных типов соответствие этой метафункции определяется реализацией, однако для целочисленных типов, не использующих биты заполнения, гарантируется наличие уникальных представлений объектов.
Если std::meta::remove_all_extents(r) представляет неполный тип, отличный от (возможно, квалифицированного cv) void, поведение не определено.
Параметры
| r | - | значение отражения |
Возвращаемое значение
true, если r имеет уникальные представления объектов; в противном случае false.
Примечания
Эту метафункцию можно использовать, чтобы определить, можно ли корректно хешировать тип, хешируя его представление объекта как массив байтов.
Пример
#include <cstdint>
#include <meta>
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(has_unique_object_representations(^^char));
// For IEC 559 floats, assertion passes because the
// value NaN has multiple object representations.
static_assert(!has_unique_object_representations(^^float));
// Should succeed in any sane implementation because ‘unpadded’ is
// typically not padded, and std::uint32_t cannot contain padding bits.
static_assert(has_unique_object_representations(^^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(!has_unique_object_representations(^^likely_padded));
// Notable architectural divergence:
static_assert(has_unique_object_representations(^^bool)); // x86
// static_assert(!has_unique_object_representations(^^bool)); // ARM
}
См. также
|
(C++26) | проверяет, представляет ли отражение (скалярное) значение (функция) |
|
(C++26) | проверяет, представляет ли отражение статический объект (функция) |
|
(C++26) | проверяет, является ли отражённый тип целочисленным типом (функция) |
|
(C++26) | проверяет, является ли отражённый тип скалярным типом (функция) |
|
(C++26) | проверяет, является ли отражённый тип типом класса, не являющегося объединением (функция) |
|
(C++26) | проверяет, является ли отражённый тип типом объединения (функция) |
|
(C++26) | проверяет, является ли отражённый тип типом массива (функция) |
|
(C++26) | проверяет, является ли отражённый тип типом со стандартной компоновкой (функция) |
|
(C++11) | объект-функция хеширования (шаблон класса) |
|
(C++17) | проверяет, влияет ли каждый бит представления объекта типа на его значение (шаблон класса) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/meta/has_unique_object_representations