【问题标题】:Implicit not operator (!) with enums explanation?带有枚举解释的隐式非运算符(!)?
【发布时间】:2018-10-06 05:58:48
【问题描述】:

我最近遇到了这段代码,我想知道它为什么会起作用。枚举声明:

enum BuildResult {
    RESULT_ERROR,
    RESULT_SUCCESS
};

后来,这个 Enum 被用在 if 语句中(忽略它可能是 RESULT_ERROR 的事实):

if (!objectHere->build_result == ClassNameHere::RESULT_SUCCESS)

我不知道您可以使用 not 运算符 ! 来翻转 Enum 的值。这仅适用于具有两种状态的枚举吗?是否有其他类型的隐式运算符可以与 Enums 一起使用?我确实找到了 this question 关于手动声明运算符的信息,但它似乎没有提到枚举的任何隐式运算符。

【问题讨论】:

    标签: c++ enums operators


    【解决方案1】:

    enum 被隐式转换为 bool。当你翻转它时,它不再是 enum 类型,而是布尔 pr-value。

    如果将enum 替换为类型安全的enum class,则无法再进行此转换。

    使用简单枚举声明时,enum 右值的行为与整数完全相同。你甚至可以指定整数的类型:

    enum myEnum : uint32_t { NOT, TYPE, SAFE };
    

    (注意枚举的隐含值:{NOT=0, TYPE=1, SAFE=2}

    【讨论】:

    • 扩展答案:这确实适用于具有两个以上状态的枚举。在普通枚举中,每个值都对应一个整数值。在这种情况下,RESULT_ERROR 为 0,RESULT_SUCCESS 为 1。由于存在从 int 到 bool 的隐式转换,因此这也适用于所有其他运算符。您可以在布尔值上使用数学运算符以及逻辑运算符。但是它们对于两个以上的状态没有多大意义,因为除了定义为 0 的状态之外的所有状态都将评估为真。
    猜你喜欢
    • 2011-01-28
    • 2023-03-31
    • 2018-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-03
    • 2011-02-04
    相关资源
    最近更新 更多