c++ - C++ 中 "enumeration type"和 "enumerated type"有什么区别?

标签 c++ language-lawyer enumeration

该标准“显然”在 [dcl.enum]/1 中定义了“枚举类型” 。术语“枚举类型”定义为 here .

最佳答案

第一个链接 ( http://eel.is/c++draft/dcl.enum#1 ) 解释了 C++ 中的枚举类型是什么。这是 C++ 官方定义的地方。

另一个链接 ( http://eel.is/c++draft/enumerated.types ) 是关于 C++ 标准库的。此链接解释了如何阅读后续章节中的标准库的描述。

例如,第 29 章中有一个类型 ios_base::seekdir 的描述:

The type seekdir is an enumerated type (16.3.3.3.3) that contains the elements indicated in Table 120.

然后他们解释说有三个可能的值begcur end。对于大多数想要使用第 29 章的库的人来说,这可能足够直观。但是由于此枚举类型是该库的公共(public)接口(interface)的一部分,其他人可能会认为,仅仅说存在三个可能的值是不够精确的。读者必须准确地知道返回 searchdir 的函数会产生什么结果。

因此,当您说“它是包含这些元素的枚举类型”时,您的第二个链接清楚地解释了它们的含义。

“枚举的同义词”一词意味着由枚举类型提供的完全相同的事物(相同的位和字节)也可以由其他类型提供。例如,如果您有一个函数返回一个枚举,其中 one=1、two=2、 Three=3,您可以随意将返回值视为该枚举类型的元素或仅视为整数。在库级别,对来自此类函数的位的两种解释没有区别。仅当您包含头文件时才会进行解释,其中函数及其返回类型都被精确定义。

第二个链接中不仅有枚举类型的定义,而且还有常量的定义,因为在库级别,枚举的各个元素(数字)不可见。在库级别,只有一个整数是可见的。但是当您想使用图书馆时,您必须了解各个图书馆的值(value)。为了实现这一点,该库将它们作为常量。

回到 seekdir 类型,通过第二个链接可以明确它将是这种类型:

enum enumerated { beg, cur, end };

inline const enumerated beg(beg);
inline const enumerated cur(cur);
inline const enumerated end(end);

通过这些内联常量,您可以在没有头文件的情况下找出枚举后面实际的数字。

关于c++ - C++ 中 "enumeration type"和 "enumerated type"有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74295185/

相关文章:

c++ - 嵌套类的嵌套类的访问权限

c# - 在 C# 中的枚举值之间迭代

C++双向链表打印

c++ - 自定义堆中的段错误

c++ - BOOST_LOG_TRIVIAL ( severity ) << ... 不重定向到文件

以枚举值作为参数的 Javascript 构造函数

ruby-on-rails - ruby 排序数组的数组

c++ - 控制结构让我失望

rust - Rust 的词汇语法是正则的、上下文无关的还是上下文敏感的?

c - 为什么两个相同的指针与 -O1 比较不相等?