我已经看着整个地方,我不敢相信这个问题以前从未问过。
标准定义的范围枚举者的订购是吗?说我有以下
#include <iostream>
enum class Fruits {Apple, Orange, Tomato};
int main(){
std::cout << (Fruits::Apple < Fruits::Orange);
std::cout << (Fruits::Orange > Fruits::Tomato);
return 0;
}
// output:
// 1 0
此输出1 0在G 中。但是该标准或编译器特定于?
完成图片并确认是的,定义了订单。我们首先是为什么一个人可以将两个枚举者放在关系表达中...
[expr.rel]
2通常在操作数上进行通常的算术转换 算术或枚举类型...
5如果两个操作数(转换后(都是算术或 枚举类型,每个操作员应产生真实 指定的关系是真实的,如果是错误的。
...在范围枚举的通常算术转换是一个毫无疑问...
[expr]
9许多期望算术操作数或 枚举类型导致转化和产量结果类型类型 方式。目的是产生一种常见类型,这也是 结果。该模式称为通常的算术转换, 定义如下:
- 如果任何一个操作数都是范围的枚举类型([dcl.enum](,则不会执行转换;如果另一个操作数没有相同的 类型,表达式不明显。
因此,它们不转换,并且只能与相同类型的对象进行比较。给出的枚举者的值(其他答案指定(是确定"如果指定的关系是真实的,如果是false,则每个操作员都会产生true" 。这就是进行比较的方式。
也值得注意的是,枚举类型变量可以采用未列举的值!因此...
enum class foo {
min, max = 10
};
foo mid = static_cast<foo>(5);
...是有效的,比较mid > foo::min
将保持相同,因为前面的段落被推广到包括命名的值不仅仅包括命名值。
在[dcl.enum]点2中指定了值的排序:
如果第一个枚举者没有初始化器,则 相应的常数为零。枚举者定义没有 初始化器使枚举者通过增加 先前的枚举者的价值。
因此,Fruits
的值分别为0, 1, 2
,并且由于对枚举的比较仅仅是类型的安全整数操作,如您所见。