为啥作用域枚举默认支持运算符'<'?
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 可以在没有任何显式重载运算符<
的情况下工作。
我在 Enumeration declaration 中没有看到任何描述。
C++ 标准对作用域枚举默认支持哪些运算符有什么规定?
【问题讨论】:
该标准对此没有专门的部分。您需要检查每个 expression 并查看它是否支持枚举。如果不支持范围枚举,它会说 unscoped enumeration。 【参考方案1】:如果您指的是“通常的算术转换”,那么当参数是算术或枚举类型时,它们就会完成。只是对于作用域枚举有一个特殊的项目符号:
[expr]
11 许多二元运算符需要算术或 枚举类型导致转换并产生类似的结果类型 方式。目的是产生一个通用类型,这也是 结果。这种模式称为通常的算术转换, 定义如下:
如果任一操作数属于范围枚举类型,则不执行任何转换;如果另一个操作数的类型不同,则表达式格式错误。
所以这里涵盖了这个案例。由于这两个操作数具有相同的作用域枚举类型,因此只需检查它们以按照人们期望的方式保持特定关系。
【讨论】:
【参考方案2】:我的理解是,作用域枚举需要被转换为底层类型或整数,然后才能应用于运算符 ==。
当它们都是作用域枚举时不会。 SomeScopedEnum < SomeInt
格式不正确,在这种情况下你是对的。
[expr.rel]p6:
如果两个操作数(转换后)都是算术或枚举类型,则如果指定关系为真,则每个运算符应产生
true
,如果为假,则产生false
。
【讨论】:
我可以说运算符 @SSY 是的,你可以。以上是关于为啥作用域枚举默认支持运算符'<'?的主要内容,如果未能解决你的问题,请参考以下文章