Code Complete 2nd Edition を読んでいたときに、次のようなコードがありました。
for ( int recordCount = 0; recordCount < MAX_RECORDS; recordCount++ ) {
// looping code that uses recordCount
}
// intervening code
for ( int recordCount = 0; recordCount < MAX_RECORDS; recordCount++ ) {
// additional looping code that uses a different recordCount
}
著者は、これに関して 3 つの異なる動作を持つ 3 つの異なる C++ コンパイラを見つけたと主張しました。
ただし、この機能を 3 つの異なる C++ コンパイラでチェックしたところ、3 つの異なる結果が得られました。
- 最初のコンパイラは、複数の変数宣言の 2 番目の for ループで recordCount にフラグを立て、エラーを生成しました。
- 2 番目のコンパイラは、2 番目の for ループで recordCount を受け入れましたが、最初の for ループの外で使用することを許可しました。
- 3 番目のコンパイラは、recordCount の両方の使用を許可し、宣言された for ループの外でどちらを使用することも許可しませんでした。
難解な言語機能でよくあることですが、コンパイラの実装はさまざまです。
C++ 仕様に関しては、3 番目のコンパイラでの動作が唯一の正しい動作であると常に信じていたため、この段落は非常に気になりました。
C++ 仕様のどのセクションでこの動作が指定されているかを調べるのを手伝ってくれる人はいますか?