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:
}