次のコードでは、C++ 1zの標準の [[fallthrough]]
属性を使用して、フォールスルーが必要であることを文書化します。
#include <iostream>
int main() {
switch (0) {
case 0:
std::cout << "a\n";
[[fallthrough]]
case 1:
std::cout << "b\n";
break;
}
}
GCC 7.1では、コードはエラーなしでコンパイルされます。ただし、コンパイラはフォールスルーについて引き続き警告します。
warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "a\n";
~~~~~~~~~~^~~~~~~~
どうして?
属性の後にセミコロンがありません:
case 0:
std::cout << "a\n";
[[fallthrough]];
// ^
case 1:
[[fallthrough]]
属性は、空のステートメントに適用されます( P0188R1 を参照)。現在のClangトランク この場合、有用なエラーが発生します :
error: fallthrough attribute is only allowed on empty statements
[[fallthrough]]
^
note: did you forget ';'?
[[fallthrough]]
^
;
更新:Cody Gray 報告済み GCCチームへのこの問題。