【问题标题】:c++ enum can compare to integer but not assign from integer?c ++枚举可以与整数比较但不能从整数分配?
【发布时间】:2017-12-03 13:37:25
【问题描述】:
#include <iostream>

enum mode { MODE0=0, MODE1, NUM_MODES};

int main(int args, char ** argv) {
  int i = 1;
  std::cout << (i == MODE0 ? "true" : "false") << "\n";
  std::cout << (i == MODE1 ? "true" : "false") << "\n";
  mode test;
  test = i; // error
}

为什么 i 与枚举值的比较工作正常,但将模式测试变量分配给整数值时出现编译错误?

enum.cc:10:8: 错误:从 'int' 到 'mode' 的无效转换 [-fpermissive]

我的问题是关于为什么比较有效而分配无效(不是如何修复我的代码),并且它在下面得到了一些很好的解释。

【问题讨论】:

标签: c++


【解决方案1】:

MODE0MODE1NUM_MODES 保证可转换为 intenum 的基础类型),但反之则不然。并非所有int 都可以转换为mode。例如,modeint 42 的匹配是什么?简单来说就是只定义了enumint的隐式转换,没有定义相反的隐式转换。

如果您想从int 转换为mode,您可以执行static_cast,以表明您有责任确保转换为mode 的值始终是合法的。试试

test = static_cast<mode>(i);

您可以通过将class 关键字添加到enum 来使用强类型枚举,以防止任何隐式转换并限制enum 值名称的范围。定义看起来像enum class mode { MODE0 = 0, MODE1, NUM_MODES };。在这种情况下,您必须对 enum 值名称进行质量处理,例如,您需要使用 mode::MODE0 而不是 MODE0。这样做的好处是可以避免名称冲突。

【讨论】:

    【解决方案2】:

    这是因为存在从枚举类型到int 的转换,但反方向没有转换。为了进行比较,MODE0 被提升为 int。对于分配,i 必须转换为 mode

    【讨论】:

      【解决方案3】:

      这样看。当您进行比较时,int 是否不是有效的可能值并不重要。如果不是,那么比较将失败,我们可以继续。现在,当我们尝试将int 分配给enum 时,您可以为其分配一个未映射到枚举值的值。因为我们不希望这种隐式发生,所以转换是无效的。如果你想告诉编译器没关系,你知道你在做什么,那么你可以像这样转换它:

      test = static_cast<mode>(i);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-08-16
        • 1970-01-01
        • 2019-06-19
        • 2012-03-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多