Namespaces
Variants

std::bit_cast

С ru.cppreference.net
 
 
Библиотека утилит
Поддержка языка
Поддержка типов (базовые типы, RTTI)
Макросы тестирования возможностей библиотеки (C++20)
Программные утилиты
Функции с переменным числом аргументов
Поддержка корутин (C++20)
Поддержка контрактов (C++26)
Трёхстороннее сравнение
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Общие утилиты
Операторы отношений (устарело в C++20)
 
 
Определён в заголовке <bit>
template< class To, class From >
constexpr To bit_cast( const From& from ) noexcept;
(начиная с C++20)

Получает значение типа To путём повторной интерпретации объектного представления From. Каждый бит в представлении значения возвращаемого To объекта равен соответствующему биту в объектном представлении from. Значения битов заполнения в возвращаемом To объекте не определены.

Если не существует значения типа To, соответствующего полученному представлению значения, поведение не определено. Если таких значений несколько, какое из них будет получено, не определено.

Бит в представлении значения результата является неопределённым, если он

  • не соответствует биту в представлении значения From (т.е. соответствует биту заполнения), или
  • соответствует биту объекта, который(до C++26)для которого наименьший охватывающий объект(начиная с C++26) не находится в пределах своего времени жизни, или
  • имеет неопределённое значение.

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

(начиная с C++26)


Результат в противном случае не содержит неопределённых или ошибочных значений.

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

Результат в противном случае не содержит неопределённых значений.

(до C++26)

Для каждого бита b в представлении значения результата, который является неопределённым или ошибочным, пусть u будет наименьшим объектом, охватывающим b:

  • Если u имеет тип, дружественный к неинициализированным, то u имеет неопределённое значение, если какие-либо биты в его представлении значения неопределены, в противном случае имеет ошибочное значение.
  • В противном случае, если b неопределён, поведение не определено.
  • В противном случае поведение является ошибочным, и результат соответствует указанному выше.
(начиная с C++26)

Эта перегрузка участвует в разрешении перегрузок только если sizeof(To) == sizeof(From) и оба To и From являются TriviallyCopyable типами.

Этот шаблон функции является constexpr тогда и только тогда, когда каждый из To, From и типы всех подобъектов To и From:

  • не является типом объединения;
  • не является типом указателя;
  • не является типом указателя на член;
  • не является типом с квалификатором volatile; и
  • не имеет нестатического элемента данных ссылочного типа.

Параметры

from - источник битов для возвращаемого значения

Возвращаемое значение

Объект типа To , чьё представление значения описано выше.

Возможная реализация

Для реализации std::bit_cast , игнорируя тот факт, что это constexpr , std::memcpy может быть использована, когда требуется интерпретировать представление объекта как представление другого типа:

template<class To, class From>
std::enable_if_t<
    sizeof(To) == sizeof(From) &&
    std::is_trivially_copyable_v<From> &&
    std::is_trivially_copyable_v<To>,
    To>
// поддержка constexpr требует магии компилятора
bit_cast(const From& src) noexcept
{
    static_assert(std::is_trivially_constructible_v<To>,
        "Эта реализация дополнительно требует "
        "чтобы тип назначения был тривиально конструируемым");
    To dst;
    std::memcpy(&dst, &src, sizeof(To));
    return dst;
}

Примечания

reinterpret_cast (или эквивалентное явное приведение типа ) между указателями или ссылочными типами не должно использоваться для переинтерпретации представления объекта в большинстве случаев из-за правила псевдонимов типов .

Макрос тестирования возможностей Значение Стандарт Функция
__cpp_lib_bit_cast 201806L (C++20) std::bit_cast

Пример

#include <bit>
#include <cstdint>
#include <iostream>
constexpr double f64v = 19880124.0; 
constexpr auto u64v = std::bit_cast<std::uint64_t>(f64v);
static_assert(std::bit_cast<double>(u64v) == f64v); // round-trip
constexpr std::uint64_t u64v2 = 0x3fe9000000000000ull;
constexpr auto f64v2 = std::bit_cast<double>(u64v2);
static_assert(std::bit_cast<std::uint64_t>(f64v2) == u64v2); // round-trip
int main()
{
    std::cout
        << "std::bit_cast<std::uint64_t>(" << std::fixed << f64v << ") == 0x"
        << std::hex << u64v << '\n'
        << "std::bit_cast<double>(0x" << std::hex << u64v2 << ") == "
        << std::fixed << f64v2 << '\n';
}

Возможный вывод:

std::bit_cast<std::uint64_t>(19880124.000000) == 0x4172f58bc0000000
std::bit_cast<double>(0x3fe9000000000000) == 0.781250

Отчёты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены задним числом к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
CWG 2482
( P1272R4 )
C++20 не было указано, будет ли возникать неопределенное поведение при работе с неопределенными битами указано

Смотрите также

неявно создаёт объекты в заданной области памяти с повторным использованием представления объекта
(function template)