2011-08-07 8 views
3

C++でのconst参照のコンセプトに関しては疑問がありました。二j文が20すなわち新しい値を印刷しないのはなぜ定数参照 - C++

int i =10; 
const int &j = i; 
cout<<"i="<<i<<" j:"<<j; // prints i:10 j:10 

i = 20; 
cout<<"i="<<i<<" j:"<<j; // prints i:20 j:10 

任意の変数への参照が両方の間の強い結合を表す場合、どのようにすることが可能ですか。

+0

gcc 4.5.2で印刷する場合、どのコンパイラを使用していますか? – Torp

+0

それは間違っています。 http://ideone.com/IATb1どのコンパイラを使用していますか? –

+0

このコードをどのコンパイラで試しましたか?これは正しいものではないはずです。予想通り、Visual Studio 2008で再現できません。 –

答えて

6

これはコンパイラのバグです。コードは20 20を印刷する必要があります。

+4

私はこれをコンパイラのバグと呼んでいません。なぜなら、基本的なので完全な失敗です。それは仕様と完全に矛盾するからです。 – Nobody

+0

これは仕様と完全に矛盾する場合はバグではありませんか? – jalf

+3

これをバグと呼ぶのは時期尚早です。まだ影響を再現できるコードはありません。上記のことがユーザーエラーであり、私たちが間違いを診断するのに関連する文脈を切り捨てている可能性は非常に高いです。 –

3

const参照は、refferantの値を変更できないことを意味します。しかし、参照者はその値を変更して参照に影響を与えることができます。私はなぜあなたが示した結果を得ているのか分かりません。

It actually changes and see the output here.

4

私はjが第二cout20を印刷しないだろう、なぜ何らかの理由が表示されません。

私はこのコードを実行しました:

int main() { 
     int i =10; 
     const int &j = i; 
     cout<<"i="<<i<<" j:"<<j << endl; // prints i:10 j:10 

     i = 20; 
     cout<<"i="<<i<<" j:"<<j << endl; // prints i:20 j:10 
     return 0; 
} 

をそして、それは私にこの出力ました:

i=10 j:10 
i=20 j:20 

がオンラインデモ自分自身を参照してください:http://ideone.com/ELbNa

意味し、どちらかあなたがしているコンパイラを(これはC++のもっとも基本的なものであるため)、または出力が正しく表示されていない可能性があります。

+1

+1または、すべてのコンテキストをコピーしていません。 –

+0

@マーティン:そうだね。 – Nawaz

0

const参照でもう一度ポイントを追加するだけで、それを初期化するために左辺値は必要ありません。たとえば、

int &r = 10;   //ERROR: lvalue required 
const int &cr = 10;  //OK 
関連する問題