为什么 std::byte 是枚举 class 而不是 class?

Why is `std::byte` an enum class instead of a class?

std::byte 是一种抽象,它应该提供对 C++ 中内存区域的类型安全(r)访问,从新标准 17 开始。但是,它是根据 [=17 以这种方式声明的=]:

enum class byte : unsigned char {} ;

也就是没有任何枚举的enum class。由于通常 enums 的目的是提供一组受限制的枚举,这似乎有点奇怪。 class 和私人 unsigned char 成员似乎是更明显的方法。

为什么会这样?

具有 unsigned char 成员的 class 标准不要求与 unsigned char 具有相同的大小或对齐方式。而标准要求枚举与其基础类型具有相同的大小和对齐方式。

现在,该标准可以简单地声明它是一个没有标准定义成员的 class 类型,但对其大小、对齐方式、constexpr 构造函数等有特定要求;实施必须遵循这些期望。但是简单地使用 enum class 来获得相同的效果要容易得多。您获得了您期望的所有构造函数和转换行为。由于 enum class 类型被视为与其基础类型不同的类型,因此您可以获得所需的所有行为,并且以这种方式定义它没有真正的缺点。