Ok。これを厳密に明確にするために、宣言とは何の関係もありません。「初期化を飛び越える」ことにのみ関連します(ISO C++ '03 6.7/3)
ここの投稿の多くは、宣言を飛び越えると変数が「宣言されていない」という結果になる可能性があると述べています。本当じゃない。POD オブジェクトは初期化子なしで宣言できますが、値は不定になります。例えば:
switch (i)
{
case 0:
int j; // 'j' has indeterminate value
j = 0; // 'j' set (not initialized) to 0, but this statement
// is jumped when 'i == 1'
break;
case 1:
++j; // 'j' is in scope here - but it has an indeterminate value
break;
}
オブジェクトが非 POD または集約である場合、コンパイラは暗黙的に初期化子を追加するため、そのような宣言を飛び越えることはできません。
class A {
public:
A ();
};
switch (i) // Error - jumping over initialization of 'A'
{
case 0:
A j; // Compiler implicitly calls default constructor
break;
case 1:
break;
}
この制限は、switch ステートメントに限定されません。「goto」を使用して初期化を飛び越えるのもエラーです。
goto LABEL; // Error jumping over initialization
int j = 0;
LABEL:
;
ちょっとした豆知識として、これは C++ と C の違いです。C では、初期化を飛び越してもエラーにはなりません。
他の人が述べたように、解決策はネストされたブロックを追加して、変数の有効期間が個々のケースラベルに制限されるようにすることです。