为啥作用域枚举默认支持运算符'<'?

Posted

技术标签:

【中文标题】为啥作用域枚举默认支持运算符\'<\'?【英文标题】:Why does the scoped enum support operator '<' by default?为什么作用域枚举默认支持运算符'<'? 【发布时间】:2019-01-28 14:02:28 【问题描述】:

考虑:

enum class Number one, two;

if (Number::one < Number::two)

我的理解是,作用域枚举需要被大小写成底层类型或整数,然后才能应用到运算符 ==上。但看起来上面的代码 sn-p 可以在没有任何显式重载运算符&lt; 的情况下工作。

我在 Enumeration declaration 中没有看到任何描述。

C++ 标准对作用域枚举默认支持哪些运算符有什么规定?

【问题讨论】:

该标准对此没有专门的部分。您需要检查每个 expression 并查看它是否支持枚举。如果不支持范围枚举,它会说 unscoped enumeration 【参考方案1】:

如果您指的是“通常的算术转换”,那么当参数是算术或枚举类型时,它们就会完成。只是对于作用域枚举有一个特殊的项目符号:

[expr]

11 许多二元运算符需要算术或 枚举类型导致转换并产生类似的结果类型 方式。目的是产生一个通用类型,这也是 结果。这种模式称为通常的算术转换, 定义如下:

如果任一操作数属于范围枚举类型,则不执行任何转换;如果另一个操作数的类型不同,则表达式格式错误。

所以这里涵盖了这个案例。由于这两个操作数具有相同的作用域枚举类型,因此只需检查它们以按照人们期望的方式保持特定关系。

【讨论】:

【参考方案2】:

我的理解是,作用域枚举需要被转换为底层类型或整数,然后才能应用于运算符 ==。

当它们都是作用域枚举时不会。 SomeScopedEnum &lt; SomeInt 格式不正确,在这种情况下你是对的。

[expr.rel]p6:

如果两个操作数(转换后)都是算术或枚举类型,则如果指定关系为真,则每个运算符应产生true,如果为假,则产生false

【讨论】:

我可以说运算符 @SSY 是的,你可以。

以上是关于为啥作用域枚举默认支持运算符'<'?的主要内容,如果未能解决你的问题,请参考以下文章

嵌套作用域中关于作用域运算符

为啥不能在位和中使用作用域枚举?

当运算符优先级说不应该时,为啥短路评估会起作用?

为啥错误控制运算符@不起作用,仍会输出错误,我使用的PHP版本为8.2.0?

第十二章 类和动态内存分配

java基础知识