2017-08-12 10 views
1

私はAccelerated C++の本からC++を学びたいと思っています。第1章の終わりに、私を襲った練習があります。基本的に、次のコードはコンパイルされ、完璧に動作しますなぜ私は疑問に思って:なぜ私のC++コードは二重に宣言された変数でもコンパイルされますか?

#include <iostream> 
#include <string> 

int main() { 
    { 
     const std::string s = "a string"; 
     std::cout << s << std::endl; 
     { 
      std::cout << s << std::endl; 
      const std::string s = "another string"; 
      std::cout << s << std::endl; 
     }; 
    } 
    return 0; 
} 

私が二重に文字列sを宣言していますし、私の理解から、これは違法であると私には思えます。私はこれをより良く理解できるように助けてくれますか?ありがとう。

a string 
a string 
another string 
+0

重複している可能性があります/重複:https://stackoverflow.com/questions/4151203/why-is-this-c-working-variables-with-the-same-name –

答えて

5

C++では、ネストされたスコープ内の変数を再宣言することができます。その範囲内で、再宣言された変数が優先されます。

標準参考のために[basic.scope.hiding]参照:

名は、ネストされた宣言領域で同じ名前の明示的な宣言または派生クラス

+0

ありがとうございました。私の理解は内側のスコープが外側に含まれていることで、最初の 's'に関する限り、それは2度宣言されていました。だから私はスコープの私の理解が少しだと思う。私が思っていたように、その概念は「線形」ではありません。 – teachMeCpp

+0

@teachMeCpp:そうです。しかし、少なくとも論理的です。 PHPとは異なり、内部スコープのように見える変数は外部スコープで見ることができます(スコープの定義は変です) – AndyG

+0

私は以下の質問をFilipに尋ねました:私はそれが論理的であると見ていますどのような状況でこの機能が役立つかを想像してください。これについてコメントできますか? – teachMeCpp

1
によって隠すことができます

これらは異なるスコープで宣言されているため、2つの別々の変数です。変数のスコープは、表示されるコードの「領域」です。

外側sは、内側ボディにsで上書きされます。

+0

ありがとうございます。私がAndyGに対する私のコメントで指摘したように、私はスコープについての私の理解はないと思う。外側の 's'は内側のボディーに上書きされていますが、コードが内側のボディーから出ると直ちに外側の' s'が復元されます。私はこの機能がどのような状況で役に立つのだろうかと疑問に思っています。私のような初心者にとっては絶対確実ではないようです。 – teachMeCpp

+0

はい、内側の体にあった 's'が範囲外になるので、外側の' s'しかありません:-) –

+0

ああ、私は同意する、他の 's'は間違いなく復元する必要があります。ネストされたスコープ内で再宣言を可能にするこの機能がいつ役に立つのだろうかと思っていました。これは問題を引き起こさないか? – teachMeCpp

関連する問題