c ++枚举可以比较整数但不能从整数分配?

时间:2017-06-29 18:04:05

标签: c++

#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:错误:来自&#39; int&#39;的无效转换到&#39;模式&#39;   [-fpermissive]

我的问题是具体说明为什么比较有效并且分配不是(不是如何修复我的代码),它在下面收到了几个很好的解释。

3 个答案:

答案 0 :(得分:6)

MODE0MODE1NUM_MODES保证可以转换为intenum的基础类型),但反之则不然。并非所有int都可以转换为mode。例如,mode 42的匹配int是什么?简单地说,只定义了从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。这样做的好处是可以避免名称冲突。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

以这种方式看待它。当您进行比较时,require 'vendor/autoload.php'; $m= new MongoDB\Client("mongodb://127.0.0.1/"); $db = $m->clients; $collection = $db->suscriptions; $query = array('email' => $email); $document = $collection->findOne($query); 是否不是有效的可能值并不重要。如果不是那么比较将失败,我们可以继续。现在,当我们尝试将int分配给int时,您可以为其分配一个未映射到枚举值的值。由于我们不希望这种隐式发生,因此转换无效。如果你想告诉编译器它没问题,你知道你在做什么,那么你可以把它像:

enum