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]]を書くとコンパイルエラー } }
参照
- P0068R0 Proposal of
[[unused]]
,[[nodiscard]]
and[[fallthrough]]
attributes. - P0188R1 Wording for
[[fallthrough]]
attribute.
お断り
この記事の内容は、C++1zが正式リリースされる際には変更される可能性があります。正式リリース後には、C++日本語リファレンスサイトcpprefjpの以下の階層の下に解説ページを用意する予定です。