我有一些c ++代码,我在其中切换枚举中的值。我试图用-Wall -Wextra -Werror编译它。使用clang时这很好。但是,GCC抱怨没有涵盖默认代码路径。简化版本如下:
enum class Types: int {
A,
B,
C
};
bool some_logic(Types val) {
switch (val) {
case Types::A:
return (false);
case Types::B:
return (true);
case Types::C:
return (false);
}
}
我可以通过在函数末尾添加一个默认大小写或另一个return语句来处理这个问题。但是,我的问题是为什么GCC没有检测到所有枚举的案例都被覆盖了?或者换句话说,海湾合作委员会在这里抱怨是否有正当理由?
我对编译器输出here进行了比较。
答案 0 :(得分:4)
因为所有案例都没有被覆盖。
可以为val
分配Types
定义中未命名的值。枚举不仅限于 这些值。
some_logic((Types)3); // whoops
如果您确实如此,请确保some_logic
仅提供您在Types
定义中指定的值,或者希望将其他案例视为"例外& #34;违规前提条件,这很好,但您仍然需要告诉计算机。
Opinion varies on the best approach,但在这种情况下,我要忽略default
(如果您稍后添加到Types
并忘记更新{{},那么您仍然会收到编译器警告{1}})但之后发布一个简单的switch
:
throw
没有任何更强烈的要求。