在使用一些自定义比较器时,我遇到了需要一个仅具有单个可能值的类型的情况。存在像std::nullptr_t
和空结构体这样的类型,这种情况就是如此。
然后我考虑使用枚举。我可以声明一个只有一个值的枚举,例如
```cpp enum class MyEnum : int { OnlyValue = 0 }; ```
enum E
{
only_value // BUT IS IT??
};
但是,标准似乎规定了所有符合声明值的“最小位域”所包含底层类型的值都是有效的。
(如果将源值转换为枚举基础类型(如果是浮点数),则该值在范围内,如果它适合容纳目标枚举中的所有枚举器的最小位域中。)
如果您只使用一种枚举器声明枚举,则最小大小可以为1个位。按照这个逻辑,另一个值的未命名枚举器应该是合法的。如果枚举器基于有符号整数,则始终可以使用-1
和0
。在无符号整数上,0
和1
始终合法。
标准中是否还有其他使未命名比特值非法或UB(未定义行为)的内容?
enum ultimate { answer=42 };
总是占用 7 位,而从 -64 到 63 的所有值都是合法的。 - Spencerenum ultimate { answer = 42 };
如何占用7位?在二进制中,数字42表示为101010,需要6位。在8位机器上,它将占用8位,因为8位是最小可寻址大小。我感到困惑。 - Thomas Matthews42
加上一个符号位。"位域"可以比8位小。 - Spencer