【问题标题】:Why are enums considered compound types?为什么枚举被认为是复合类型?
【发布时间】:2010-05-26 22:55:14
【问题描述】:

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

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

或者,如果我对复合类型的理解不正确,那么究竟是什么类型使它成为复合类型? compound 仅仅是 user-defined 的同义词吗?

【问题讨论】:

  • 在 C 中,使用术语“派生类型”而不是“复合类型”,并且在 C 中枚举不是派生类型。这让我觉得 C++ 中的“复合类型”不仅意味着将类型复合为新类型,还意味着将值复合为新类型。给定枚举的描述使人们更加怀疑“枚举,它包含一组命名的常量值”。
  • @Johannes C 中的枚举和 C++ 中的枚举是完全不同的野兽,不是吗?例如,您可以在 C 中为枚举变量分配整数值,但在 C++ 中则不能。
  • 正确但在两种语言中它们都定义了自己的类型。但我想我对这两个术语解释得太多了。 “复合类型”实际上似乎只是指复合类型的作用,而像 AndreyT 所说的枚举的底层类型是复合类型,似乎:)
  • 标准引入了诸如“复合类型”之类的术语而没有激励它们,这有点令人遗憾。也许有人有带注释的参考手册并且可以查一下?那会很好。
  • ARM 使用术语“派生类型”并且同样不包括枚举。似乎这个术语的动机是“派生”在 C++ 中具有不同的含义(从其他类派生的类)。不过我认为你有一个很好的观点。 C 与底层整数类型(甚至兼容)的接近性可能促使他们不制作枚举派生类型,并反过来促使 C++ 设计者制作复合类型。

标签: c++ enums types


【解决方案1】:

在 C++ 中,枚举类型是 标量 类型,但同时它们是复合类型,因为它们是建立在一些基本整数类型之上的。在数组或指针的情况下,您明确指定“基本”类型,但在枚举的情况下,特定的基础整数类型由实现隐式自动选择。您无法手动控制底层整数类型,这仍然不会取消枚举类型在本质上是复合的。

一些编译器(以及未来的 C++ 标准 C++0x)允许用户为给定的枚举类型指定底层整数类型,这使得它实际上是一种复合类型更加明显。有关示例,请参阅here

enum class Color : char { red, blue };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多