#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]
我的问题是具体说明为什么比较有效并且分配不是(不是如何修复我的代码),它在下面收到了几个很好的解释。
答案 0 :(得分:6)
MODE0
,MODE1
和NUM_MODES
保证可以转换为int
(enum
的基础类型),但反之则不然。并非所有int
都可以转换为mode
。例如,mode
42的匹配int
是什么?简单地说,只定义了从enum
到int
的隐式转换,没有定义相反的隐式转换。
如果您想从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