std::byte
是一个抽象,从新标准 17 开始,它应该提供对 C++ 中内存区域的类型安全(r)访问。但是,根据 http://en.cppreference 是这样声明的。 com/w/cpp/类型/字节:
enum class byte : unsigned char {} ;
也就是说,它是一个没有任何枚举的
enum class
。由于通常 enums
的目的是提供一组受限的枚举,因此这看起来有点奇怪。具有私有 unsigned char
成员的类似乎是更明显的方法。
为什么要这样做?
class
成员的
unsigned char
与
unsigned char
具有相同的大小或对齐方式。而标准要求枚举与其基础类型具有相同的大小和对齐方式。现在,标准可以简单地声明它是一个
class
类型,没有标准定义的成员,但对其大小、对齐方式、
constexpr
构造函数等有特定要求;实施必须遵循这些期望。但简单地使用
enum class
来获得相同的效果要容易得多。您将获得您期望的所有构造函数和转换行为。由于
enum class
类型被视为与其基础类型不同的类型,因此您可以获得所需的所有行为,并且以这种方式定义它没有真正的缺点。
std::byte
具有与
unsigned char
相同的大小、对齐方式和表示形式。当涉及到类时,实现有太多的自由度。例如,尽管在实践中没有过度对齐,但并不能阻止实现过度对齐
struct byte { unsigned char b; };
。您可以在
std::byte
、
P0298 - 字节类型定义: 的提案中找到更多基本原理 实施方案
最初考虑了
std::byte
的两种可能的定义:
// Alternative A: namespace std { enum class byte : unsigned char {}; }
和
// Alternatve B: namespace std { using byte = /* implementation defined */; }
我们发现替代方案 A 更容易向普通程序员展示和解释。出于所有实际目的, 它具有正确的语义。在向图书馆工作组提出两种替代方案后,草拟民意调查 一致支持替代方案 A,即本文提出的形式。