今日、驚くべきことに、次のコードが完全に有効であることを発見しました (gcc 4.4.5):
int get_int(const int& i)
{
if(i == 0)
{
int i = 1;
return i;
}
return i;
}
私は本当に驚いています。受け入れる必要がある場合は、新しい変数が独自のブロック内にあり、外部のコードの残りの部分が引き続きパラメーターにアクセスできるため、パラメーターが実際にはシャドウされていないため、それはある程度理にかなっていると言えます。しかし、それでも意味がわかりません。なぜこれを無効な構文にしなかったのですか? これを許可しても何のメリットもないと思います。実際、これによって引き起こされたバグを掘り下げる必要がありました。それは長い関数であり、パラメーターと同じ名前を持っていることに気付かずに独自の変数を作成しました。コードのいくつかの行 (同じブロック) は、まさにそのパラメーター変数に依存しており、今では私のバージョンを使用しています。そして、私の一日は1時間になります。
私はコンパイラについて非常に表面的な知識を持っているので、誰かがこの動作の背後にある完全なストーリーを説明してくれませんか? 比較として、このような Java コードでは無効です (重複変数)。