std:: byte
|
Definiert im Header
<cstddef>
|
||
|
enum
class
byte
:
unsigned
char
{
}
;
|
(seit C++17) | |
std::byte
ist ein eigenständiger Typ, der das Konzept des Bytes gemäß der Definition in der C++-Sprachspezifikation implementiert.
Wie
unsigned
char
kann es verwendet werden, um auf Rohspeicher zuzugreifen, der von anderen Objekten belegt ist (
Objektdarstellung
), aber im Gegensatz zu
unsigned
char
ist es kein Zeichentyp und kein arithmetischer Typ.
std::byte
modelliert lediglich eine Ansammlung von Bits und unterstützt nur Bitschiebeoperationen mit einem Integer sowie bitweise und Vergleichsoperationen mit einem anderen
std::byte
.
Inhaltsverzeichnis |
Nicht-Member-Funktionen
std:: to_integer
|
template
<
class
IntegerType
>
constexpr IntegerType to_integer ( std :: byte b ) noexcept ; |
(seit C++17) | |
Entspricht: return IntegerType ( b ) ; Diese Überladung nimmt nur dann 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 dann 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 dann 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) |
Hinweise
Ein numerischer Wert n kann mithilfe von std :: byte { n } in einen Byte-Wert konvertiert werden, dank der C++17 relaxed enum class initialization Regeln.
Ein Byte kann auf die übliche Weise in einen numerischen Wert umgewandelt werden (z.B. um einen Integer-Hash eines Objekts zu erzeugen) mit einer
expliziten Konvertierung
oder alternativ mit
std::to_integer
.
| Feature-Test Makro | Wert | Std | Feature |
|---|---|---|---|
__cpp_lib_byte
|
201603L
|
(C++17) |
std::byte
|
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; // Fehler: Kann int nicht in byte konvertieren. std::byte y{1}; // OK // if (y == 13) {} // Fehler: Kann nicht verglichen werden. if (y == std::byte{13}) {} // OK, Bytes sind vergleichbar int arr[]{1, 2, 3}; // int c = a[y]; // Fehler: Array-Index ist keine Ganzzahl [[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; // Fehler: b ist kein arithmetischer Typ 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