警告 C26819

switch ラベルどうしの間に、注釈の付いていないフォールスルーがある (es.78)。

解説

このチェックでは、switch ステートメントの暗黙的なフォールスルーが対象となります。 暗黙的なフォールスルーは、[[fallthrough]]; ステートメントを使用せずに、制御フローが 1 つのスイッチ ケースから次のスイッチ ケースに直接転送される場合です。 この警告は、少なくとも 1 つのステートメントを含むスイッチ ケースで暗黙的なフォールスルーが検出されると発生します。

詳細については、C++ Core Guidelines の「ES.78: switch ステートメント内の暗黙的なフォールスルーに依存しない」を参照してください。

このサンプルでは、暗黙的なフォールスルーは空でない switchcase 値から次 caseのようになります。

void fn1();
void fn2();

void foo(int a)
{
    switch (a)
    {
        case 0:    // implicit fallthrough from case 0 to case 1 is OK because case 0 is empty
        case 1:
            fn1(); // implicit fallthrough from case 1 into case 2
        case 2:    // Warning C26819.
            fn2();
            break;
        default:
            break;
    }
}

この問題を解決するには、フォールスルーが発生する場所に [[fallthrough]]; ステートメントを挿入します。

void fn1();
void fn2();

void foo(int a)
{
    switch (a)
    {
        case 0:
        case 1:
            fn1();
            [[fallthrough]]; // fallthrough is explicit
        case 2:
            fn2();
            break;
        default:
            break;
    }
}

この問題を解決するもう 1 つの方法は、暗黙的なフォールスルーを削除することです。

void fn1();
void fn2();

void foo(int a)
{
    switch (a)
    {
        case 0:
        case 1:
            fn1();
            break; // case 1 no longer falls through into case 2
        case 2:
            fn2();
            break;
        default:
            break;
    }
}

関連項目

ES.78: ステートメントの暗黙的なフォールスルーに switch 依存しない