Namespaces
Variants

std::bit_cast

Von de.cppreference.net
 
 
Dienstprogrammbibliothek
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Koroutinen-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Dreiveg-Vergleich
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

Allgemeine Dienstprogramme
Relationale Operatoren (veraltet in C++20)
Integer-Vergleichsfunktionen
(C++20)(C++20)(C++20)    
(C++20)
Swap und Typoperationen
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
Gängige Vokabular-Typen
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
Definiert im Header <bit>
template< class To, class From >
constexpr To bit_cast( const From& from ) noexcept;
(seit C++20)

Ermittelt einen Wert vom Typ To durch Neuinterpretation der Objektdarstellung von From. Jedes Bit in der Wertdarstellung des zurückgegebenen To-Objekts ist gleich dem entsprechenden Bit in der Objektdarstellung von from. Die Werte der Padding-Bits im zurückgegebenen To-Objekt sind unspezifiziert.

Wenn es keinen Wert vom Typ To gibt, der der erzeugten Wertdarstellung entspricht, ist das Verhalten undefiniert. Wenn es mehrere solcher Werte gibt, ist unspezifiziert, welcher Wert erzeugt wird.

Ein Bit in der Wertdarstellung des Ergebnisses ist unbestimmt, wenn es

  • nicht einem Bit in der Wertdarstellung von From entspricht (d.h. es einem Padding-Bit entspricht), oder
  • einem Bit entspricht eines Objekts, das(bis C++26)für das das kleinste umschließende Objekt(seit C++26) sich nicht innerhalb seiner Lebensdauer befindet, oder
  • einen unbestimmten Wert hat.

Ein Bit in der Wertdarstellung des Ergebnisses ist fehlerhaft, wenn es einem Bit entspricht, für das das kleinste umschließende Objekt einen fehlerhaften Wert hat.

(seit C++26)


Das Ergebnis enthält ansonsten keine unbestimmten oder fehlerhaften Werte.

Für jedes Bit in der Wertdarstellung des Ergebnisses, das unbestimmt ist, hat das kleinste Objekt, das dieses Bit enthält, einen unbestimmten Wert; das Verhalten ist undefiniert, es sei denn, dieses Objekt ist von einem uninitialisiert-freundlichen Typ.

Das Ergebnis enthält ansonsten keine unbestimmten Werte.

(bis C++26)

Für jedes Bit b in der Wertdarstellung des Ergebnisses, das unbestimmt oder fehlerhaft ist, sei u das kleinste Objekt, das b umschließt:

  • Wenn u von uninitialisiert-freundlichem Typ ist, u hat einen unbestimmten Wert, wenn eines der Bits in seiner Wertdarstellung unbestimmt ist, oder ansonsten einen fehlerhaften Wert.
  • Andernfalls, wenn b unbestimmt ist, ist das Verhalten undefiniert.
  • Andernfalls ist das Verhalten fehlerhaft, und das Ergebnis ist wie oben angegeben.
(seit C++26)

Diese Überladung nimmt nur dann an der Überladungsauflösung teil, wenn sizeof(To) == sizeof(From) und sowohl To als auch From TriviallyCopyable-Typen sind.

Diese Funktionsvorlage ist constexpr genau dann, wenn jeder von To, From und die Typen aller Unterobjekte von To und From:

  • kein Union-Typ ist;
  • kein Zeigertyp ist;
  • kein Zeiger-auf-Member-Typ ist;
  • kein volatile-qualifizierter Typ ist; und
  • kein nicht-statisches Datenelement von Referenztyp hat.

Parameter

from - die Quelle der Bits für den Rückgabewert

Rückgabewert

Ein Objekt vom Typ To , dessen Wertdarstellung wie oben beschrieben ist.

Mögliche Implementierung

Um std::bit_cast zu implementieren, unter Vernachlässigung der Tatsache, dass es constexpr ist, kann std::memcpy verwendet werden, wenn es erforderlich ist, die Objektdarstellung als die eines anderen Typs zu interpretieren:

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-Unterstützung benötigt Compiler-Magie
bit_cast(const From& src) noexcept
{
    static_assert(std::is_trivially_constructible_v<To>,
        "Diese Implementierung erfordert zusätzlich, "
        "dass der Zieltyp trivial konstruierbar ist");
    To dst;
    std::memcpy(&dst, &src, sizeof(To));
    return dst;
}

Hinweise

reinterpret_cast (oder gleichwertiger expliziter Cast ) zwischen Zeiger- oder Referenztypen sollte in den meisten Fällen nicht zur Neuinterpretation der Objektdarstellung verwendet werden, aufgrund der Type-Aliasing-Regel .

Feature-Test Makro Wert Std Feature
__cpp_lib_bit_cast 201806L (C++20) std::bit_cast

Beispiel

#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); // Rundreise
constexpr std::uint64_t u64v2 = 0x3fe9000000000000ull;
constexpr auto f64v2 = std::bit_cast<double>(u64v2);
static_assert(std::bit_cast<std::uint64_t>(f64v2) == u64v2); // Rundreise
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';
}

Mögliche Ausgabe:

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

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 2482
( P1272R4 )
C++20 es war nicht spezifiziert, ob UB auftreten würde, wenn unbestimmte Bits beteiligt sind spezifiziert

Siehe auch

Erstellt implizit Objekte in gegebenem Speicher unter Wiederverwendung der Objektrepräsentation
(Funktions-Template)