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

时间:2017-06-12 20:27:39

标签: c++ c++17 c++-standard-library

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

enum class byte : unsigned char {} ;

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

为什么这样做?

1 个答案:

答案 0 :(得分:18)

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

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