Spec-Zone.ru › C++

std::has_unique_object_representations

Определено в заголовочном файле <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 >
inline 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>

Примечания

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

Макрос проверки функций feature-test Значение Std Функция
__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
}

См. также

is_standard_layout
(C++11)
проверяет, является ли тип типом стандартного расположения
(шаблон класса)
hash
(C++11)
объект хеш-функции
(шаблон класса)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/types/has_unique_object_representations

Spec-Zone.ru

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