注:最初にこれに対するコメントを読んでください。Johannes は、適切に配置された 1 つの標準的な引用で、多かれ少なかれ私の議論全体を否定しました。;-)
私は C++ 標準を利用できないので、C 標準から推定する必要があります。
(私にとっては)驚くべきことに、章 6.2.1識別子のスコープでは、宣言の時点から始まる識別子のスコープについて何も述べていません (私が推測したように)。int a
、あなたの例では、「関連するブロックの最後で終了する」block scopeがあり、それについて言われていることはそれだけです。章6.8.6.1 gotoステートメントは、「gotoステートメントは、可変的に変更された型を持つ識別子のスコープ外からその識別子のスコープ内にジャンプしてはならない」と述べていますが、ブロック内でgoto
のみジャンプするため(および、したがって、 の範囲は、ISO/IEC 9899:1999 に関する限り問題ないようです。int a
これにはかなり驚かされます…
編集 #1:後で簡単に Google を検索して、C++0x の最終ドラフトを手に入れました。関連する声明は、ここにあると思います(6.7宣言声明、私の強調表示):
ブロックに転送することは可能ですが、初期化で宣言をバイパスする方法ではできません。自動保存期間を持つ変数がスコープ内にないポイントからスコープ内にあるポイントにジャンプするプログラムは、変数がスカラー型、単純なデフォルト コンストラクターと単純なデストラクタを持つクラス型を持たない限り、形式が正しくありません。これらの型のいずれかの cv 修飾バージョン、または上記の型のいずれかの配列であり、 initializer なしで宣言されています。
あなたのコードは標準の基準で問題ないと思います。しかし、お尻は醜いです、気をつけてください。;-)
編集#2:int a
後方へのジャンプによる破壊の可能性についてのコメントを読んで、これを見つけました(6.6ジャンプステートメント、私の強調表示):
ループからの転送、ブロックからの転送、または自動保存期間を持つ初期化された変数を超える転送には、転送元のポイントではスコープ内にあるが転送先のポイントではスコープ内にない、自動ストレージ期間を持つオブジェクト
の破棄が含まれます。
1つint a
は「初期化」されておらず、標準用語を正しく理解していればオブジェクトではありません。