该标准实际上要求这些常量是变量,而不仅仅是枚举数,即它们在内存中具有地址,而不仅仅是常量的标签。它不要求它们是枚举,它们可以是整数或位集。规范要求:
// 27.5.3.1.4开放模式
typedef T3 开放模式;
static constexpr openmode app = unspecified ;
static constexpr openmode ate = unspecified ;
static constexpr openmode binary = unspecified ;
static constexpr openmode in = unspecified ;
static constexpr openmode out = unspecified ;
static constexpr openmode trunc = unspecified ;
因此,为了满足这个要求,声明类型(在标准库中作为枚举),然后声明该类型的几个变量,并具有必要的值。
另一种实现是:
enum _Openmode
{ // constants for file opening options
_In = 0x01,
_Out = 0x02,
_Ate = 0x04,
_Openmask = 0xff};
static const _Openmode in = _In;
static const _Openmode out = _Out;
static const _Openmode ate = _Ate;
这看起来更像您的预期,但这样做没有任何优势。如果有的话,更糟的是,因为它向命名空间添加了额外的未使用名称(_In、_Out、_Ate 等),从而阻止了在实现的其他地方使用这些相同的名称,并且(非常轻微地)减慢了名称查找速度。
与传统的应用程序或库代码相比,标准库的实现方式通常看起来很不寻常。这需要满足标准库的确切要求,该标准库必须在所有可能的情况下都可用,并且还避免导致用户代码出现问题(例如名称冲突或链接器错误)。