You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么C++ scoped枚举(enum class)的比较操作属于合法行为?

用户提问

尽管作用域枚举(enum class)无法被隐式转换为整型,但我在GCC 10.3环境下依然可以使用<运算符对其进行比较。

#include <algorithm>
#include <iostream>

enum class Colours {
    Red = 0,
    Green = 1,
    Blue = 2
};

int main() {
    std::cout << (std::min(Colours::Blue, Colours::Red) < Colours::Green) << std::endl;
    return 0;
}

请问上述行为是否属于C++标准规定的合法行为?如果是,能否提供相关标准说明作为参考依据?


解答

结论

该行为是C++标准明确规定的合法行为,所有符合标准的编译器都会支持该操作。

规则说明

  • 作用域枚举(enum class)仅禁止隐式转换为整型的行为,也就是你不能直接把枚举值传入要求输入整型的上下文,例如int x = Colours::Red; 这种写法属于非法操作。
  • 但C++标准原生支持同类型枚举值之间的所有关系运算符操作,包括<、>、<=、>=、==、!=,比较时会直接取两个枚举值对应的底层整型数值做比对,不需要触发到整型的隐式转换,完全符合语法规则。
  • 你提供的示例代码中,std::min接收两个Colours类型参数返回同类型结果,再和同类型的Colours::Green做小于比较,全程没有需要隐式转换为整型的场景,自然可以正常编译运行,输出结果固定为1。

标准依据

C++标准[expr.rel]章节明确规定:当两个操作数为相同枚举类型时,关系运算符的比对结果为两个操作数对应的底层值的比对结果。
枚举类型的通用规则中也明确说明,所有枚举类型(包括作用域枚举)都默认支持相等运算符和关系运算符,仅作用域枚举禁止隐式转换到整型。

内容的提问来源于stack exchange,提问作者Kolansburg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 01:54:02