Considérez ce code:
void foo()
{
goto bar;
int x = 0;
bar: ;
}
GCC et Clang le rejettent , car le saut pour bar:
contourne l'initialisation des variables. MSVC ne se plaint pas du tout (sauf si l'utilisation x
après bar:
provoque un avertissement).
Nous pouvons faire une chose similaire avec switch
:
void foo()
{
switch (0)
{
int x = 0;
case 0: ;
}
}
Désormais, les trois compilateurs émettent des erreurs .
Ces extraits sont-ils mal formés? Ou causent-ils de l'UB?
Je pensais que les deux étaient mal formés, mais je ne trouve pas les parties révélatrices de la norme. [stmt.goto] ne dit rien à ce sujet, pas plus que [stmt.select] .
c++
language-lawyer
goto
initializer
variable-declaration
HolyBlackCat
la source
la source
x
après le saut./permissive-
drapeau à MSVC et il se plaindra également. Je ne sais pas si le comportement de MSVC sans cet indicateur est bien défini (je suppose que oui, sinon pourquoi le permettrait-il?).Réponses:
Il est mal formé lorsque l'initialisation est non vide.
L'initialiseur rend l'initialisation non vide. En revanche, cette
serait bien formé. Bien que les mises en garde habituelles concernant l'utilisation
x
avec une valeur indéterminée s'appliquent.la source
De la déclaration goto :
la source