2013-05-06 11 views
5

私は驚くべき発見し、次のコードは完全に有効であることを、今日(GCC 4.4.5):興味深い場合(パラメータがあればブロックに影のない)

int get_int(const int& i) 
{ 
    if(i == 0) 
    { 
     int i = 1; 
     return i; 
    } 
    return i;  
} 

私は本当に驚いています。私がそれを受け入れなければならない場合は、新しい変数が独自のブロック内にあるので、それは意味をなさないと言うことができます。そのため、外部のコードは引き続きパラメータにアクセスできるため、パラメータは実際にはシャドーされません。しかし、なぜ私はこれを無効な構文にしていないのですか?私はこれを許すというメリットはなく、実際には、これによって引き起こされたバグを掘り下げなければなりませんでした。それは長い関数であり、パラメータと同じ名前を持っていることを認識せずに自分の変数を作成し、後で(同じブロック)いくつかのコード行は、非常にパラメータ変数に依存していて、今は私のバージョン私の1時間は行く。

私はコンパイラに関する非常に表面的な知識を持っていますので、誰かが私にこの動作の全貌を説明することができますか?比較のため、このようなJavaコードでは無効です(重複変数)。

+0

コンパイラの熟練者ではありませんが、私は引数がint& "shadowing"変数であることを疑問に思います。 –

+0

私は 'get_int(int i)'も試みました。違いはありません。 – user1861088

+5

'int i 'のスコープは宣言されたブロックです。これはブロック内のパラメータをシャドウしますが、その外側にはありません。 「なぜ関数の代わりにブロックに変数がスコープされているのですか?答えは "それは言語の規則が言うことです。"異なる言語は異なる規則に従います。それが彼らを異ならせる理由です。 –

答えて

1

「参照は、その引数の値を変更することになっている機能を実装するために使用することができます」 - C++プログラミング言語はでBjarne Stroustroupを引用します答えはシンプルです:有効なCコードを受け入れるためです。

また、関連スコープが名前空間、クラス、関数、またはブロックスコープであるかどうかを意識することなく、同じスコープで同じ識別子の異なる意味を扱うために、ルールが簡単になります。

+0

もう少し説明してくれるのでしょうか?これが有効なCコードを受け入れることとどのように関係しているかを説明できますか? – user1861088

+0

導入されたC++の人気は、C++のルールの下で、すべての良いCコードが受け入れられるという事実に依存していました。 –

-4

変数を渡すのではなく、参照を渡しています。 C++がこれを可能にする理由を求めている場合はP.62

+0

これは質問のポイントを逃しています。「なぜ、私は部分的にパラメータをシャドーすることができますか? –

+0

あなたは質問を得ていませんでした。申し訳ありませんが、私はそれをより明確にしませんでした。また、私はconst参照を渡したので、とにかく違いはありません – user1861088

関連する問題