为什么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
相关产品推荐
相关产品推荐

