为什么 gcc 不检测所有处理的枚举值?

dfr*_*ese 0 c++ gcc gcc-warning clang++

我有一些 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以通过在函数末尾添加一个 default case 或另一个 return 语句来处理这个问题。但是,我的问题是为什么 GCC 没有检测到枚举的所有情况都已涵盖?或者换一种说法,海湾合作委员会在这里抱怨是否有正当理由?

我在此处对编译器输出进行了比较。

Lig*_*ica 5

因为没有涵盖所有情况。

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

some_logic((Types)3);  // whoops
Run Code Online (Sandbox Code Playgroud)

如果您真的、正确地确定some_logic只会提供您在Types定义中命名的值,或者希望将其他情况视为“异常”前提条件违规,那很好,但您仍然需要告诉计算机。

关于最佳方法的意见各不相同,但在这种情况下,我会省略default(这样如果您稍后添加Types并忘记更新,您仍然会收到编译器警告switch)但throw之后简单地说:

bool some_logic(const Types val)
{
    switch (val) {
        case Types::A:
            return (false);
        case Types::B:
            return (true);
        case Types::C:
            return (false);
    }

    throw std::runtime_error("Didn't expect that innit");
}
Run Code Online (Sandbox Code Playgroud)

在没有任何更强的要求的情况下。