There is a conflict here between language syntax and common sense. For us humans, it looks like this code (taken from 1800 INFORMATION's answer) should work fine:
class A
{
// has some non-trivial constructor and destructor
};
switch (x)
{
case 1:
A a;
break;
default:
// do something else
}
After all, the curly braces define the scope for a; it is only created if we enter case 1, it is destroyed immediately after leaving the case 1 block and it will never be used unless we enter case 1. In fact, the case labels and the break instruction do not separate scopes, so a exists in all the block afterwards, even though it is logically unreachable. And sure, there is no such thing as a case 1 block from a syntactic point of view.
If you think of the switch statement as a bunch of (structured) goto instructions in disguise, the scope problem becomes more evident:
{
if (x == 1)
goto 1;
else
goto default;
1:
A a;
goto end;
default:
// do something else
end:
}