Namensräume
Varianten
Aktionen

std::byte

Von cppreference.com
< cpp‎ | types
 
 
Dienstprogramm-Bibliotheken
Sprachunterstützung
Typunterstützung (Basistypen, RTTI)
Bibliotheks-Feature-Test-Makros (C++20)
Programm-Dienstprogramme
Variadische Funktionen
Coroutine-Unterstützung (C++20)
Vertragsunterstützung (C++26)
Drei-Wege-Vergleich
(C++20)
(C++20)(C++20)(C++20)  
(C++20)(C++20)(C++20)

Allgemeine Hilfsmittel
Relationale Operatoren (in C++20 veraltet)
 
 
Definiert in Header <cstddef>
enum class byte : unsigned char {};
(seit C++17)

std::byte ist ein eigener Typ, der das Konzept eines Bytes wie in der C++-Sprachdefinition spezifiziert umsetzt.

Ähnlich wie unsigned char kann er zur Adressierung des Rohspeichers anderer Objekte (Objektrepräsentation) verwendet werden, ist aber im Gegensatz zu unsigned char kein Zeichentyp und kein arithmetischer Typ. std::byte modelliert eine reine Bitsammlung und unterstützt lediglich Bitshift-Operationen mit einer Ganzzahl sowie bitweise und Vergleichsoperationen mit einem anderen std::byte.

Inhalt

[bearbeiten] Nicht-Member-Funktionen

std::to_integer

template< class IntegerType >
constexpr IntegerType to_integer( std::byte b ) noexcept;
(seit C++17)

Äquivalent zu: return IntegerType(b); Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_integral_v<IntegerType> true ist.

std::operator<<=,operator>>=

template< class IntegerType >
constexpr std::byte& operator<<=( std::byte& b, IntegerType shift ) noexcept;
(1) (seit C++17)
template< class IntegerType >
constexpr std::byte& operator>>=( std::byte& b, IntegerType shift ) noexcept;
(2) (seit C++17)
1) Äquivalent zu: return b = b << shift; Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_integral_v<IntegerType> true ist.
2) Äquivalent zu: return b = b >> shift;

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_integral_v<IntegerType> true ist.

std::operator<<,operator>>

template< class IntegerType >
constexpr std::byte operator<<( std::byte b, IntegerType shift ) noexcept;
(1) (seit C++17)
template< class IntegerType >
constexpr std::byte operator>>( std::byte b, IntegerType shift ) noexcept;
(2) (seit C++17)
1) Äquivalent zu: return std::byte(static_cast<unsigned int>(b) << shift); Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_integral_v<IntegerType> true ist.
2) Äquivalent zu: return std::byte(static_cast<unsigned int>(b) >> shift);

Diese Überladung nimmt nur an der Überladungsauflösung teil, wenn std::is_integral_v<IntegerType> true ist.

std::operator|=,operator&=,operator^=

constexpr std::byte& operator|=( std::byte& l, std::byte r ) noexcept;
(1) (seit C++17)
constexpr std::byte& operator&=( std::byte& l, std::byte r ) noexcept;
(2) (seit C++17)
constexpr std::byte& operator^=( std::byte& l, std::byte r ) noexcept;
(3) (seit C++17)
1) Äquivalent zu: return l = l | r;.
2) Äquivalent zu: return l = l & r;.
3) Äquivalent zu: return l = l ^ r;.

std::operator|,operator&,operator^,operator~

constexpr std::byte operator|( std::byte l, std::byte r ) noexcept;
(1) (seit C++17)
constexpr std::byte operator&( std::byte l, std::byte r ) noexcept;
(2) (seit C++17)
constexpr std::byte operator^( std::byte l, std::byte r ) noexcept;
(3) (seit C++17)
constexpr std::byte operator~( std::byte b ) noexcept;
(4) (seit C++17)
1) Äquivalent zu: return std::byte(static_cast<unsigned int>(l) | static_cast<unsigned int>(r));.
2) Äquivalent zu: return std::byte(static_cast<unsigned int>(l) & static_cast<unsigned int>(r));.
3) Äquivalent zu: return std::byte(static_cast<unsigned int>(l) ^ static_cast<unsigned int>(r));.
4) Äquivalent zu: return std::byte(~static_cast<unsigned int>(b));

[bearbeiten] Hinweise

Ein numerischer Wert n kann mittels std::byte{n} in einen Byte-Wert umgewandelt werden, aufgrund der C++17 erweiterten Initialisierungsregeln für enum class.

Ein Byte kann wie üblich mit einer expliziten Umwandlung oder alternativ mit std::to_integer in einen numerischen Wert umgewandelt werden (z.B. um einen Integer-Hash eines Objekts zu erzeugen).

Feature-Test-Makro Wert Std Feature
__cpp_lib_byte 201603L (C++17) std::byte

[bearbeiten] Beispiel

#include <bitset>
#include <cassert>
#include <cstddef>
#include <iostream>
#include <utility>
 
std::ostream& operator<<(std::ostream& os, std::byte b)
{
    return os << std::bitset<8>(std::to_integer<int>(b));
}
 
int main()
{
    // std::byte y = 1; // Error: cannot convert int to byte.
    std::byte y{1}; // OK
 
    // if (y == 13) {} // Error: cannot be compared.
    if (y == std::byte{13}) {} // OK, bytes are comparable
 
    int arr[]{1, 2, 3};
    // int c = a[y]; // Error: array subscript is not an integer
    [[maybe_unused]] int i = arr[std::to_integer<int>(y)]; // OK
    [[maybe_unused]] int j = arr[std::to_underlying(y)];   // OK
 
    auto to_int = [](std::byte b) { return std::to_integer<int>(b); };
 
    std::byte b{42};
    assert(to_int(b) == 0b00101010);
    std::cout << b << '\n';
 
    // b *= 2; // Error: b is not of arithmetic type
    b <<= 1;
    assert(to_int(b) == 0b01010100);
 
    b >>= 1;
    assert(to_int(b) == 0b00101010);
 
    assert(to_int(b << 1) == 0b01010100);
    assert(to_int(b >> 1) == 0b00010101);
 
    b |= std::byte{0b11110000};
    assert(to_int(b) == 0b11111010);
 
    b &= std::byte{0b11110000};
    assert(to_int(b) == 0b11110000);
 
    b ^= std::byte{0b11111111};
    assert(to_int(b) == 0b00001111);
}

Ausgabe

00101010