【问题标题】:Why is `std::byte` an enum class instead of a class?为什么`std::byte`是一个枚举类而不是一个类?
【发布时间】:2017-11-14 10:41:25
【问题描述】:
std::byte 是一种抽象,它应该在 C++ 中提供对内存区域的类型安全(r)访问,从新标准 17 开始。但是,它是根据http://en.cppreference.com/w/cpp/types/byte 声明的:
enum class byte : unsigned char {} ;
也就是说,它是一个没有任何枚举的enum class。因为通常enums 的目的是提供一组受限的枚举,这似乎有点奇怪。具有私有 unsigned char 成员的类似乎是更明显的方法。
为什么会这样?
【问题讨论】:
标签:
c++
c++17
c++-standard-library
【解决方案1】:
标准不要求具有unsigned char 成员的class 与unsigned char 具有相同的大小或对齐方式。而标准要求枚举与其基础类型具有相同的大小和对齐方式。
现在,标准可以简单地声明它是 class 类型,没有标准定义的成员,但对其大小、对齐方式、constexpr 构造函数等有特定要求;实施必须遵循这些期望。但是简单地使用enum class 来获得相同的效果要容易得多。您将获得您期望的所有构造函数和转换行为。由于enum class 类型被视为与其基础类型不同的类型,因此您可以获得所需的所有行为,而以这种方式定义它并没有真正的缺点。