Considere este código:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
O GCC e o Clang rejeitam , porque o salto para bar:
ignora a inicialização da variável. O MSVC não reclama de nada (exceto usar x
after bar:
causa um aviso).
Podemos fazer uma coisa semelhante com um switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Agora todos os três compiladores emitem erros .
Esses trechos estão mal formados? Ou eles causam UB?
Eu costumava pensar que ambos eram mal formados, mas não consigo encontrar as partes reveladoras do padrão. [stmt.goto] não diz nada sobre isso, nem [stmt.select] .
c++
language-lawyer
goto
initializer
variable-declaration
HolyBlackCat
fonte
fonte
x
depois do salto./permissive-
sinalizador ao MSVC e ele também irá reclamar. Não sei se o comportamento do MSVC sem esse sinalizador está bem definido (eu diria que sim, caso contrário, por que eles permitiriam?).Respostas:
É mal formado quando a inicialização não é vazia.
O inicializador torna a inicialização não vazia. Em contraste, isso
seria bem formado. Embora as advertências usuais sobre o uso
x
com um valor indeterminado se apliquem.fonte
Da declaração goto :
fonte