标准::少在枚举上

std::less on enums

本文关键字:枚举 标准      更新时间:2023-10-16

标准是否保证std::less<MyEnumType>MyEnumType排序,就好像将值 MyEnumType 转换为适当大小的整数类型一样?

enum MyEnumType { E1 = 0, E2 = 6, E3 = 3 };

是的,std::less::operator()定义为 (§20.8.5/5):

operator()返回x < y

对于在枚举类型上使用关系运算符,说明如下 (§5.9/2):

通常的算术转换是在算术或枚举类型的操作数上执行的。

对于无作用域枚举类型,通常的算术转换定义为执行积分提升。无作用域枚举类型的积分提升定义为 (§5/9):

基础类型不固定 (7.2) 的无作用域枚举类型的 prvalue 可以转换为以下类型中第一个类型的 prvalue,该 prvalue 可以表示枚举的所有值(即,7.2 中所述的 bmin 到 bmax 范围内的值):intunsigned intlong intunsigned long intlong long intunsigned long long int

如果可用且需要,将使用扩展整数类型。

枚举的类型定义为某种整数类型,其大小足以容纳枚举的所有值。允许编译器决定具体类型是什么(尽管现在有一种方法可以控制这一点)。但是该类型绝对是某种整型类型,这意味着对同一枚举类型的两个值的比较运算符的行为将与您预期的方式非常相似。