Преобразовано в компилируемый код в xx.cpp:
class C
{
int i;
public:
C(int i_val = 0) : i(i_val) { }
};
int main()
{
int someval = 2;
goto label; //error
C x;
label:
switch (someval)
{
case 1:
C x2;
break;
case 2: //error
C x3;
break;
}
}
и скомпилировано, как показано в G ++ 4.6.0 на MacOS X 10.6.8, выдает указанные ошибки:
$ g++ -Wall -Wextra -c xx.cpp
xx.cpp: In function ‘int main()’:
xx.cpp:13:1: error: jump to label ‘label’ [-fpermissive]
xx.cpp:11:10: error: from here [-fpermissive]
xx.cpp:12:7: error: crosses initialization of ‘C x’
xx.cpp:19:14: error: jump to case label [-fpermissive]
xx.cpp:17:15: error: crosses initialization of ‘C x2’
$
Существует конструктор по умолчанию для каждой из переменных x
, x2
и x3
.
А в стандарте C ++ просто говорится, что вам нельзя прыгать в блок после создания переменной. Что бы работать это:
class C
{
int i;
public:
C(int i_val = 0) : i(i_val) { }
};
int main()
{
int someval = 2;
goto label; //error
{
C x;
}
label:
switch (someval)
{
case 1:
{
C x2;
}
break;
case 2: //error
{
C x3;
}
break;
}
}
С тремя дополнительными парами фигурных скобок вы больше не прыгаете в блоки, где переменные объявляются и инициализируются, поэтому код является корректным и корректно компилируется в командной строке, показанной ранее.