为什么gcc没有检测到所有处理的枚举?

时间:2018-03-26 16:38:00

标签: c++ gcc clang++ gcc-warning

我有一些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进行了比较。

1 个答案:

答案 0 :(得分:4)

因为所有案例都没有被覆盖。

可以为val分配Types定义中未命名的值。枚举不仅限于 这些值。

some_logic((Types)3);  // whoops

如果您确实如此,请确保some_logic仅提供您在Types定义中指定的值,或者希望将其他案例视为"例外& #34;违规前提条件,这很好,但您仍然需要告诉计算机。

Opinion varies on the best approach,但在这种情况下,我要忽略default(如果您稍后添加到Types并忘记更新{{},那么您仍然会收到编译器警告{1}})但之后发布一个简单的switch

throw

没有任何更强烈的要求。