switch case 语句后控制到达非 void 函数的末尾

jjc*_*mar 0 c++ enums switch-statement

我有一段代码,其中对枚举类的所有值执行 switch case 语句。所有分支都有 return 语句,但 gcc(至少 10.5 和 trunk)仍然认为控件可以到达函数末尾。相同的代码可以在 clang 16 中正常编译。

这是正确的还是 gcc 中的错误?

#include <cassert>

enum class C
{
    A, B
};

int foo()
{
    C c;
    switch (c) {
        case C::A:
          assert(false);
        case C::B:
          return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

https://godbolt.org/z/v3K6jx5aG

Kam*_*Cuk 5

这是正确的还是 gcc 中的错误?

这是对的。

enum是一个int(或另一个整数类型),它可以存储任何整数。未初始化的枚举c可以具有任何值,但也不同于所有枚举器列表元素。

请注意,您的代码不正确。读取c内部未初始化值的唯一行为switch (c)是使您的代码具有技术上未定义的行为。

是否产生有关读取未初始化值或有关控制流可能到达非 void 函数末尾的警告取决于编译器的良好意愿,这不是必需的。这是一个实施质量问题。

  • *“未初始化的枚举 c 可以具有任何值”*未初始化的变量具有与“任何值”不同的不确定值。如果它有“任何值”,那么 `c == c` 将为 `true`,但它是未定义的行为。 (4认同)
  • 该错误未初始化“c”,这会立即导致未定义的行为。不返回所有值只是警告,因为只有潜在的 UB (3认同)
  • @jjcasmar clang 中的错误是什么? (2认同)