标准::少在枚举上
std::less on enums
标准是否保证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 范围内的值):
int
、unsigned int
、long int
、unsigned long int
、long long int
或unsigned long long int
。
如果可用且需要,将使用扩展整数类型。
枚举的类型定义为某种整数类型,其大小足以容纳枚举的所有值。允许编译器决定具体类型是什么(尽管现在有一种方法可以控制这一点)。但是该类型绝对是某种整型类型,这意味着对同一枚举类型的两个值的比较运算符的行为将与您预期的方式非常相似。
相关文章:
- 不带大括号的枚举形式
- 枚举环境变量的惯用C++14/C++17方法
- 类似枚举的计算常量
- 如何正确实现和访问运算符的各种自定义枚举器
- 错误:从"int"到枚举c++的转换无效
- C++中构造函数中的枚举
- 访问在 C++ 结构中声明的枚举变量
- 枚举类'classname'的多重定义
- 强枚举类型定义:Clang Bug 还是 C++11 标准不确定性?
- typedef 枚举和枚举类有什么区别?
- 为什么我的开关/机箱在使用枚举时默认?
- 标准::可选枚举的比较运算符
- 作用域枚举和标准::get
- 警告 C4481 枚举中使用的非标准扩展名'MyEnum'限定名称中使用
- 标准::少在枚举上
- 不透明和匿名枚举声明如何符合标准的要求?
- 如何按标准迭代枚举
- 此枚举声明是否符合标准?
- 无法访问常量静态标准::映射枚举结构
- C++ 标准没有说明枚举类的运算符!=()和运算符==()