带有枚举解释的隐式非运算符(!)?

Aar*_*nke 2 c++ enums operators

我最近遇到了这段代码,我想知道为什么它有效.枚举声明:

enum BuildResult {
    RESULT_ERROR,
    RESULT_SUCCESS
};
Run Code Online (Sandbox Code Playgroud)

后来,这个枚举在if语句中使用(忽略了一个事实,它可以替代地RESULT_ERROR):

if (!objectHere->build_result == ClassNameHere::RESULT_SUCCESS)
Run Code Online (Sandbox Code Playgroud)

我不知道你可以使用not运算符!来翻转Enum的值.这只适用于有两种状态的枚举吗?是否有其他类型的隐式运算符可以与Enums一起使用?我也发现这个问题,有关手动声明运营商,但它似乎并没有提及任何隐含的运营商枚举.

Kos*_*tas 5

enum被隐式现浇到bool.当你翻转它时,它不再是一个enum类型,而是一个布尔值.

如果要更换enumenum class,这是类型安全的,这种转换是不再可能.

当使用简单的枚举声明时,enumrvalues的行为与整数完全相同.您甚至可以指定整数的类型:

enum myEnum : uint32_t { NOT, TYPE, SAFE };
Run Code Online (Sandbox Code Playgroud)

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

  • 扩展答案:这实际上适用于具有2个以上状态的枚举.在正常枚举中,每个值对应一个整数值.在这种情况下,RESULT_ERROR为0,RESULT_SUCCESS为1.由于存在从int到bool的隐式转换,因此这也适用于所有其他运算符.你可以使用数学运算符,以及bool上的逻辑运算符.但是对于两个以上的状态它们没有多大意义,因为除了定义为0的状态之外的所有状态都将评估为真. (2认同)