Spec-Zone.ru › C++

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
}

См. также

is_value
(C++26)
проверяет, представляет ли отражение (скалярное) значение
(функция)
is_object
(C++26)
проверяет, представляет ли отражение статический объект
(функция)
is_integral_type
(C++26)
проверяет, является ли отражённый тип целочисленным типом
(функция)
is_scalar_type
(C++26)
проверяет, является ли отражённый тип скалярным типом
(функция)
is_class_type
(C++26)
проверяет, является ли отражённый тип типом класса, не являющегося объединением
(функция)
is_union_type
(C++26)
проверяет, является ли отражённый тип типом объединения
(функция)
is_array_type
(C++26)
проверяет, является ли отражённый тип типом массива
(функция)
is_standard_layout_type
(C++26)
проверяет, является ли отражённый тип типом со стандартной компоновкой
(функция)
hash
(C++11)
объект-функция хеширования
(шаблон класса)
has_unique_object_representations
(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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API