No código a seguir, uso o [[fallthrough]]
atributo padrão do C ++ 1z para documentar que uma falha é desejada:
#include <iostream>
int main() {
switch (0) {
case 0:
std::cout << "a\n";
[[fallthrough]]
case 1:
std::cout << "b\n";
break;
}
}
Com o GCC 7.1, o código é compilado sem erros. No entanto, o compilador ainda me avisa sobre uma queda:
warning: this statement may fall through [-Wimplicit-fallthrough=]
std::cout << "a\n";
~~~~~~~~~~^~~~~~~~
Por quê?
c++
switch-statement
c++17
fall-through
s3rvac
fonte
fonte
Respostas:
Está faltando um ponto e vírgula após o atributo:
case 0: std::cout << "a\n"; [[fallthrough]]; // ^ case 1:
O
[[fallthrough]]
atributo deve ser aplicado a uma instrução vazia (ver P0188R1 ). O tronco Clang atual apresenta um erro útil neste caso :error: fallthrough attribute is only allowed on empty statements [[fallthrough]] ^ note: did you forget ';'? [[fallthrough]] ^ ;
Atualização: Cody Gray relatou esse problema à equipe do GCC.
fonte
fallthrough attribute is only allowed on empty statements
; uma vez que não é seguido por uma instrução vazia, o gcc simplesmente o ignoraclang
conserte-o.