为什么我会收到 `warning: control reaches end of non-void function` with switch-case?

Why do I get `warning: control reaches end of non-void function` with switch-case?

考虑这样的代码:

enum class Foo
{
    A, B
};

int deliverPizza(Foo foo)
{
    switch (foo) {
    case Foo::A:
        return 0;
    case Foo::B:
        return 1;
    }
}

int main()
{
    return deliverPizza(Foo::A);
}

使用 $ g++ -o main main.cpp -Wreturn-type 编译:

main.cpp: In function ‘int deliverPizza(Foo)’:
main.cpp:14:1: warning: control reaches end of non-void function [-Wreturn-type]

这是为什么?据我所知,所有情况都在交换机内处理。是 GCC 不理解案例 return 吗?

另一方面,添加 default 会使 Clang 警告 Default label in switch which covers all enumeration values

当您通过强制转换表达式构造 enum 实例时,您仍然可以 运行 进入 UB。

return deliverPizza(static_cast<Foo>(42));

这是允许的并且可以愉快地编译。我想关于这种情况的警告是迂腐的。