std::byte

来自cppreference.com
< cpp‎ | types
 
 
工具库
通用工具
格式化库 (C++20)
(C++11)
关系运算符 (C++20 中弃用)
整数比较函数
(C++20)(C++20)(C++20)
(C++20)
swap 与类型运算
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
常用词汇类型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)

初等字符串转换
(C++17)
(C++17)
栈踪
 
类型支持
基本类型
基础类型
定宽整数类型 (C++11)
byte
(C++17)
数值极限
C 数值极限接口
运行时类型信息
类型特性
类型类别
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
(C++11)
类型属性
(C++11)
(C++11)
(C++14)
(C++11)
(C++11)(C++20 前)
(C++11)(C++20 中弃用)
(C++11)
类型特性常量
元函数
(C++17)
常量求值语境
受支持操作
关系与属性查询
类型修改
(C++11)(C++11)(C++11)
类型变换
(C++11)
(C++11)
(C++17)
(C++11)(C++20 前)(C++17)
 
定义于头文件 <cstddef>
enum class byte : unsigned char {} ;
(C++17 起)

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

charunsigned 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