【发布时间】:2015-10-03 15:37:44
【问题描述】:
假设以下简单示例:
enum class Test { One = 1, Two = 2, Three = 3 };
int main()
{
Test t{};
}
上面的代码似乎在 Clang、GCC 和 MSVC 上编译得很好。我担心的是,虽然用于表示各个枚举数的数值范围的 基础 整数类型完全能够将 0 表示为一个值,但 0 值并不映射到常量本身。正是这种差异令人困惑(整数类型范围与枚举的枚举数的范围)。从int 的角度来看,t 的值似乎是“定义明确的”,但从某种意义上说,它的定义并不明确,因为它作为标量没有映射到枚举常量之一。
我的搜索结果是this SO post,但最佳答案是非常技术性的,我不太明白。我在这里从一个稍微不同的角度提出这个问题,看看我是否能得到一个对我来说更有意义的答案。
具有固定值枚举器的枚举与没有它们的枚举之间是否存在不同的规则和/或保证?上面的代码对于带有未显式分配的枚举器的枚举非常有意义,这是令人困惑的固定值情况。
【问题讨论】:
-
枚举类型的对象具有一系列有效值,这取决于枚举数的值。但是,并非该范围内的所有值都需要与枚举器相关联。考虑位标志,您将在其中 OR 一些枚举器并将结果转换回枚举类型。
-
@dyp 你有你提到的位标志场景的一个小的具体例子吗?
-
嗯,想多了,我现在不会用这种方式写代码了。我在考虑
enum bit_flags { FLAG_A = 1 << 0, FLAG_B = 1 << 1 }; void foo(bit_flags); foo( bit_flags(FLAG_A | FLAG_B) );有更好的解决方案,例如单独的bit_flag和bit_set类型,其中多个bit_flags 的OR'ing 产生bit_set。从类型安全的角度来看,foo(bit_flags)可能仍然比一些foo(int)更好。