std::byte
| 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) |
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) |
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) |
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) |
[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