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

问题描述 投票:0回答:2

std::byte
是一个抽象,从新标准 17 开始,它应该提供对 C++ 中内存区域的类型安全(r)访问。但是,根据 http://en.cppreference 是这样声明的。 com/w/cpp/类型/字节:

enum class byte : unsigned char {} ;

也就是说,它是一个没有任何枚举的

enum class
。由于通常
enums
的目的是提供一组受限的枚举,因此这看起来有点奇怪。具有私有
unsigned char
成员的类似乎是更明显的方法。

为什么要这样做?

c++ c++17 c++-standard-library std-byte
2个回答
30
投票
标准不要求具有

class

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

现在,标准可以简单地声明它是一个

class

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


1
投票
正如已接受的答案所提到的,目标是

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,即本文提出的形式。

© www.soinside.com 2019 - 2024. All rights reserved.