C++1z フォールスルー時の警告を抑制する[[fallthrough]]属性

switch文で下のcaseに処理を流すことを「フォールスルー (fallthrough)」と言います。

#include <iostream>

int main()
{
    int n = 1;
    switch (n) {
        case 1:
            std::cout << "1" << std::endl;
            // break; を書かずに、処理を下に流す
        case 2:
            std::cout << "2" << std::endl;
            break;
    }
}
1
2

意図しないフォールスルーによってバグが発生することを防止するために、コンパイラがフォールスルーを検出して、コンパイル時に警告を出力する場合があります。

C++1zでは、意図したフォールスルーであることをコンパイラに伝え、警告を抑制するための[[fallthrough]]属性が導入されます。これは、フォールスルーしたい各caseの最後の式として記述します。一番下のcase/defaultには[[fallthrough]]属性は記述できません。

#include <iostream>

int main()
{
    int n = 1;
    switch (n) {
        case 1:
            std::cout << "1" << std::endl;
            [[fallthrough]]; // 意図したフォールスルーであることをコンパイラに伝える
                             // (警告が出力されない)
        case 2:
            std::cout << "2" << std::endl;
            break; // 一番下のcase/defaultに[[fallthrough]]を書くとコンパイルエラー
    }
}

参照

お断り

この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。