声明枚举 class 基础类型 bool 有什么好处?

Any benefits to declare an enum class underlying type bool?

在我目前正在开发的库中,我有这个小东西:

enum class BoolMode : uint8_t
{
    TrueIfFalse = 0,
    TrueIfTrue  = 1
};

这是一个用于轻松生成可逆条件检查的小帮手,同时只需创建一个易于编写和阅读的单一实现...

为了让这个助手有效地易于使用,我必须为 bool (显然) 定义比较运算符].我是这样做的:

inline constexpr bool operator ==(const bool boolValue, const BoolMode mode) noexcept
{
    return (boolValue == static_cast<const bool>(mode));
}

inline constexpr bool operator !=(const bool boolValue, const BoolMode mode) noexcept
{
    return (boolValue != static_cast<const bool>(mode));
}

inline constexpr bool operator ==(const BoolMode mode, const bool boolValue) noexcept
{
    return (boolValue == static_cast<const bool>(mode));
}

inline constexpr bool operator !=(const BoolMode mode, const bool boolValue) noexcept
{
    return (boolValue != static_cast<const bool>(mode));
}

我想知道这样定义BoolMode是否有任何好处:

enum class BoolMode : bool
{
    TrueIfFalse = false,
    TrueIfTrue  = true
};

由于无论如何都必须努力定义比较运算符,所以我看不出最好的选择是什么...

问题:

提前致谢。

如果 boolX 的基础类型,那么 std::underlying_type_t<X> 就是 bool

boolenum 类型的 bool 基础类型的变量只有两个有效状态; 01.

uint8_tenum 类型的 uint8_t 类型的变量有 256 个有效状态; 0255.

编译器和元编程都可以意识到这种差异。自定义 notstd::optional 可以使用 3 不是有效 bool 的事实来使 notstd::optional<bool> 占用一个字节(它的值将为 0 false1 用于 true3 用于 nullopt)。

这也可用于在序列化时将具有 bool 基础类型的 boolenum 智能打包到位字段中。

理论上,当 bool 是基础类型时,为 == 生成的程序集可以进行位比较而不是零或非零字节检查。我可以想象更快的平台。同时,如果 uint8_t 是基础类型,则枚举中的非零值 anywhere 意味着它在转换为 bool 时映射到 true

None 这些问题的可能性很大。