【问题标题】: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

标签: c++ enums


【解决方案1】:

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

[expr]

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

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

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

【讨论】:

    【解决方案2】:

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

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

    [expr.rel]p6:

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

    【讨论】:

    • 我可以说运算符
    • @SSY 是的,你可以。
    猜你喜欢
    • 2023-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-31
    • 1970-01-01
    • 2018-12-09
    • 2011-01-28
    相关资源
    最近更新 更多