По сути, потому что инициализация переменной будет пропущена, если метка, содержащая инициализацию переменной, не будет нажата. Это было бы плохо, потому что компилятор должен был бы тогда испускать код, который разрушил бы упомянутую переменную, если и только если код инициализации был выполнен.
Например:
class A
{
// has some non-trivial constructor and destructor
};
switch (x)
{
case 1:
A a;
break;
default:
// do something else
}
Если бы код набрал default
, то a
не было бы инициализировано. Компилятор должен был бы быть в состоянии выяснить это заранее. Вероятно, по соображениям производительности это было запрещено.
Простое решение состоит в том, чтобы ввести новый уровень области действия:
class A
{
// has some non-trivial constructor and destructor
};
switch (x)
{
case 1:
{
A a;
}
break;
default:
// do something else
}
Теперь все в порядке, разрушение a
теперь четко определено.