【发布时间】:2013-03-16 15:14:31
【问题描述】:
众所周知,C++03中enum的递增和递减是非法的,因为C++03的enum可能不是连续的。但是 C++11 标准引入了新的 enum class 构造,根据 Wikipedia 的说法,它更加类型安全,因为它不是基于任何简单的可数类型构建的。所以现在,如果我们有一个枚举值的有界列表,我们可以写类似
enum class Colors { Black, Blue, White };
// ...
Colors color = Colors::White;
color++;
它是否可以正常工作(例如,White 的递增将返回 Black,Black 的递减将返回White)?
如果我们无法编写此类代码,您是否知道 boost 或 Qt 中的任何类似行为的类为我们提供了此功能(正确的递增和递减)?
【问题讨论】:
-
没有什么可以说类枚举的值是连续的。在这方面,它们与 C++03 枚举相同。
-
@juanchopanza:C++03 枚举肯定继承了按顺序分配值的 C 行为。每个没有初始值设定项的枚举项是前一项 + 1。如果第一个项没有初始值设定项,则它的值为零。这是完全有保证和标准的,并且自有标准以来一直如此。见第 7.2p2 节
-
谁告诉你
enum class不是基于基本整数类型构建的?唯一的区别是现在您可以选择自己选择基本类型,而不是编译器以依赖于实现的方式进行。 -
枚举的可表示值的范围始终是连续的。该范围内的哪些值具有明确的名称,哪些没有是完全不相关的。不能将上述运算符与枚举对象一起使用这一事实与它的连续性无关。