为什么枚举被认为是复合类型?

13

数组、函数、指针、引用、类、联合、枚举和成员指针都是复合类型

我对复合类型的理解是它基于其他类型。例如,T[n]T*T& 都是基于 T。那么枚举类型基于哪些类型呢?

或者如果我的复合类型理解有误,那么什么样的类型才能被称为复合类型?复合仅仅是用户自定义的同义词吗?


在C语言中,“派生类型”(derived type)这个术语被用来代替“复合类型”(compound type),而在C语言中,枚举不是派生类型。这让我想到,在C++中,“复合类型”不仅指将类型组合成新类型,也指将值组合成新类型。枚举的描述加强了这种怀疑,它说“枚举由一组命名的常量值组成”。 - Johannes Schaub - litb
@Johannes 在C语言中,枚举类型和在C++中的枚举类型是完全不同的东西,不是吗?例如,在C语言中,您可以将整数值分配给枚举变量,但在C++中则不行。 - fredoverflow
正确但是两种语言都定义了自己的类型。但我想我可能对这两个术语进行了太多的解释。实际上,“复合类型”似乎只是指将类型组合在一起的行为,就像AndreyT所说的那样,对于枚举来说底层类型就是组合的类型 :) - Johannes Schaub - litb
有点遗憾的是,标准引入了“复合类型”等术语,但没有解释它们的动机。也许有人有注释参考手册并可以查阅一下?那就太好了。 - fredoverflow
ARM使用“派生类型”这个术语,不包括枚举类型。看起来这个术语的动机是因为在C++中,“派生”的含义与其他类派生的类不同。然而,我认为你说得很有道理。C语言接近底层整数类型(甚至与之兼容),这可能促使他们不将枚举类型作为派生类型,反过来促使C++设计者将它们作为复合类型。 - Johannes Schaub - litb
1个回答

13
在C++中,枚举类型是标量类型,但同时它们也是复合类型,因为它们是建立在某些基本整数类型之上的。对于数组或指针,您需要显式指定“基本”类型,但是对于枚举类型,具体的底层整数类型是由实现隐含地自动选择的。您无法手动控制底层整数类型,但这并不意味着枚举类型不符合复合性质。
一些编译器(以及未来的C++标准C++0x)允许用户为给定的枚举类型指定底层整数类型,这使得它更明显地成为一个复合类型。请参见这里的示例。
enum class Color : char { red, blue };

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接