私は驚くべき発見し、次のコードは完全に有効であることを、今日(GCC 4.4.5):興味深い場合(パラメータがあればブロックに影のない)
int get_int(const int& i)
{
if(i == 0)
{
int i = 1;
return i;
}
return i;
}
私は本当に驚いています。私がそれを受け入れなければならない場合は、新しい変数が独自のブロック内にあるので、それは意味をなさないと言うことができます。そのため、外部のコードは引き続きパラメータにアクセスできるため、パラメータは実際にはシャドーされません。しかし、なぜ私はこれを無効な構文にしていないのですか?私はこれを許すというメリットはなく、実際には、これによって引き起こされたバグを掘り下げなければなりませんでした。それは長い関数であり、パラメータと同じ名前を持っていることを認識せずに自分の変数を作成し、後で(同じブロック)いくつかのコード行は、非常にパラメータ変数に依存していて、今は私のバージョン私の1時間は行く。
私はコンパイラに関する非常に表面的な知識を持っていますので、誰かが私にこの動作の全貌を説明することができますか?比較のため、このようなJavaコードでは無効です(重複変数)。
コンパイラの熟練者ではありませんが、私は引数がint& "shadowing"変数であることを疑問に思います。 –
私は 'get_int(int i)'も試みました。違いはありません。 – user1861088
'int i 'のスコープは宣言されたブロックです。これはブロック内のパラメータをシャドウしますが、その外側にはありません。 「なぜ関数の代わりにブロックに変数がスコープされているのですか?答えは "それは言語の規則が言うことです。"異なる言語は異なる規則に従います。それが彼らを異ならせる理由です。 –