# std::byte

< cpp‎ | types

定义于头文件 `<cstddef>` |  |
enum class byte : unsigned char {} ; |  | (C++17 起)

`std::byte` 是一种独立类型，它实现指定于 C++ 语言定义中的字节的概念。

同 char 与 unsigned char ，它能用于访问其他对象所占据的生内存（对象表示），但不同于这些类型，它不是字符类型且非算术类型。 byte 只是位的汇集，而且只对它定义逐位运算符。

### 非成员函数

## std::to_integer

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

等价于： return IntegerType(b); 此重载仅若 std::is_integral_v<IntegerType> 为 true 才参与重载决议。

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

template <class IntegerType> constexpr std::byte& operator<<=(std::byte& b, IntegerType shift) noexcept; | (1) | (C++17 起)
template <class IntegerType> constexpr std::byte& operator>>=(std::byte& b, IntegerType shift) noexcept; | (2) | (C++17 起)

1) 等价于： return b = b << shift; 此重载仅若 std::is_integral_v<IntegerType> 为 true 才参与重载决议。
2) 等价于： return b = b >> shift; 此重载仅若 std::is_integral_v<IntegerType> 为 true 才参与重载决议。

## std::operator<<,operator>>

template <class IntegerType> constexpr std::byte operator <<(std::byte b, IntegerType shift) noexcept; | (1) | (C++17 起)
template <class IntegerType> constexpr std::byte operator >>(std::byte b, IntegerType shift) noexcept; | (2) | (C++17 起)

1) 等价于： return std::byte(static_cast<unsigned int>(b) << shift); 此重载仅若 std::is_integral_v<IntegerType> 为 true 才参与重载决议。
2) 等价于： return std::byte(static_cast<unsigned int>(b) >> shift);

此重载仅若 std::is_integral_v<IntegerType> 为 true 才参与重载决议。

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

constexpr std::byte& operator|=(std::byte& l, std::byte r) noexcept; | (1) | (C++17 起)
constexpr std::byte& operator&=(std::byte& l, std::byte r) noexcept; | (2) | (C++17 起)
constexpr std::byte& operator^=(std::byte& l, std::byte r) noexcept; | (3) | (C++17 起)

1) 等价于： return l = l | r; 。
2) 等价于： return l = l & r; 。
3) 等价于： return l = l ^ r; 。

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

constexpr std::byte operator|(std::byte l, std::byte r) noexcept; | (1) | (C++17 起)
constexpr std::byte operator&(std::byte l, std::byte r) noexcept; | (2) | (C++17 起)
constexpr std::byte operator^(std::byte l, std::byte r) noexcept; | (3) | (C++17 起)
constexpr std::byte operator~(std::byte b) noexcept; | (4) | (C++17 起)

1) 等价于： return std::byte(static_cast<unsigned int>(l) |
static_cast<unsigned int>(r)); 。
2) 等价于： return std::byte(static_cast<unsigned int>(l) &
static_cast<unsigned int>(r)); 。
3) 等价于： return std::byte(static_cast<unsigned int>(l) ^
static_cast<unsigned int>(r)); 。
4) 等价于： return std::byte(~static_cast<unsigned int>(b)); 。

### 注意

由于 C++17 放松的 enum class 初始化规则，能用 `std::byte{n`} 转换数值 `n` 为 byte 值。

能用 std::to_integer 转换 byte 为数值（例如生成对象的整数哈希）。

### 示例

    #include <iostream>
    #include <cstddef>

    int main()
    {
        std::byte b{42};
        std::cout << std::to_integer<int>(b) << "\n";

        // b *= 2 编译错误
        b <<= 1;
        std::cout << std::to_integer<int>(b) << "\n";
    }

输出：

    42
    84