enum class pid
{
Alpha, Beta, Gamma
};
int main()
{
int propId = 2;
switch(propId)
{
case pid::Alpha:
case pid::Beta:
case pid::Gamma:
break;
}
}
上面的片段在msvc2012中编译好(并且有效)但在clang-3.4和g ++ - 4.8中失败。这些需要在switch子句中使用static_cast<pid>(propId)
。
顺便说一句,没有显式转换的简单赋值,例如pid a = propId;
会在每个编译器中产生错误。
哪一个做对了?
答案 0 :(得分:6)
标准条款4,“标准转换”,仅列出 unscoped 枚举。因此,强大的枚举不有任何标准转换,您必须在任一方向使用static_cast
。
你可以说,这种明确性是强烈的枚举的全部要点。它们不是一蹴而就的整数,而是需要明确的意图声明。请注意[感谢@DyP] switch
语句明确支持强枚举,而不需要手动转换为某种整数类型。