为什么 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
类型被视为与其基础类型不同的类型,因此您可以获得所需的所有行为,并且以这种方式定义它没有真正的缺点。
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
类型被视为与其基础类型不同的类型,因此您可以获得所需的所有行为,并且以这种方式定义它没有真正的缺点。