c++ - Scoped Enums(枚举类)关系运算符
问题描述
我到处看了看,我不敢相信这个问题以前没有被问过。
范围枚举器的顺序是否由标准定义?说如果我有以下
#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
这在 g++ 中输出 1 0。但是这个标准或编译器是特定的吗?
解决方案
要完成图片并确认是,定义了排序。我们从为什么可以将两个枚举数放在一个关系表达式中开始......
[expr.rel]
2通常的算术转换是在算术或枚举类型的操作数上执行的......
5如果两个操作数(转换后)都是算术或枚举类型,则如果指定的关系为真,则每个运算符都应返回真,如果为假,则返回假。
...其中范围枚举的通常算术转换是无操作的...
[表达式]
9许多期望算术或枚举类型的操作数的二元运算符会导致转换并以类似的方式产生结果类型。目的是产生一个通用类型,这也是结果的类型。这种模式称为通常的算术转换,其定义如下:
- 如果任一操作数属于范围枚举类型 ([dcl.enum]),则不执行任何转换;如果另一个操作数的类型不同,则表达式格式错误。
所以它们不会转换,只能与相同类型的对象进行比较。给枚举器的值(由另一个答案指定)决定了“如果指定的关系为真,则每个运算符都应产生真,如果为假,则应产生假”。这样比较就完成了。
还值得注意的是,枚举类型变量可以采用未枚举的值!那么例如...
enum class foo {
min, max = 10
};
foo mid = static_cast<foo>(5);
... 是有效的,并且比较mid > foo::min
将保持不变,因为前面的段落被概括为不仅仅包括命名值。
推荐阅读
- yaml - 如何让 TYPO3 路由增强器正确使用自定义扩展(TYPO 3 v10)
- docker - Kubernetes - 如何在没有 App 永久运行的情况下制作简单的 Linux 容器镜像
- asp.net-mvc - 如何在 mvc razor 页面中将我的所有文本框输入字母更改为大写?
- r - 查找具有特定因子组最小值的行
- flutter - 如何管理颤振应用程序中的选项卡
- emacs - display-buffer 从其他窗口生成缓冲区
- r - `facet_grid` 标签触及条带的边界
- postgresql - 使用独立模式 Kafka-connect 从 Postgres SQL 更改数据捕获到 kafka 主题
- javascript - 如何从对象获取数据并创建对象数组?
- typescript - 在 Vercel 上部署下一个 js 应用程序时反应钩子表单 v7 问题