2011-07-03 13 views
6

私はC++のリファレンスを使いこなしています。私が理解しているのは、非const変数とその同じ変数へのconst参照を持ち、非const変数を変更した場合、参照にその変更が反映されるということです。const std :: stringリファレンスの参照先を変更する

例:

void foo() { 
    int x = 5; 
    const int& y = x; 
    x = 10; 
    std::cout << "x = " << x << std::endl; 
    std::cout << "y = " << y << std::endl; 
} 

は私のために次の出力を生成します。

x = 10 
y = 10 

をしかし、私ははstdする::文字列をタイプを変更した場合、const参照を反映していないようです修正変数:

void foo() { 
    std::string x = "abc"; 
    const std::string& y = x; 
    x = "xyz"; 
    std::cout << "x = " << x << std::endl; 
    std::cout << "y = " << y << std::endl; 
} 

は私のために、以下を生成します。

std ::文字列でこれをしようとしたときに
x = xyz 
y = abc 

これは通常予想される動作ですか? (私はGCC 4.6.0を使用していますが、私は現時点で利用可能な他のコンパイラはありませんので、この特定のバージョンでのみ起こっているかどうかわかりません)

+0

* G ++でコンパイルされたそのコード - MP-4.6(GCC)4.6.0 20100814枚の*のプリントが '二回、私は別の最適化レベルで試してみましたxyz' 。あなたは*正確なコードをコピーしましたか? –

+0

私の期待どおりに動作します。 ( "xyz \ nxyz \ n")。これは私にはBCAKのバグかコピー&ペーストのバグがあると信じています。コードを確認し、コンパイル可能なバージョンのコードを投稿してください(**コピー&ペースト**を使用してください)。 –

+0

情報ありがとうございました。別のファイルにコピーして貼り付けることで、私が期待していたように動作させました。オリジナルをバイナリモードで見たとき、私の宣言の中の "&"の前に隠されていたたくさんの余分なバイトがありました。私はそれがどのようにしてコンパイルされているのか分かりません。しかし、これで私を助けてくれてありがとう。あなたはすべて素晴らしいです! – Bobby

答えて

10

ちょうど私のために期待どおりwith GCC 4.3.44.5.1 MSVC 10でオフラインとしてあなたが私たちにあなたが実行するコードを表示されていないか、私が信じていない4.6.0のバグがあります。実際のコードでconst std::stringだけでなく、実際にリファレンスを使用していますか?

+0

私が見せなかった私のコードのほんの一部は、ヘッダーファイルのinclude、main()の前のfoo()、main()の宣言だけでした。私はこれを別のファイルに書き直しました。これは私が今思い描いていたように動作しています(つまり、y = xyz)。元のコードに何か不具合がありますか? – Bobby

+0

@Bobby:あなたが気付かなかったいくつかの意図しない違いがあります。 2つのファイルのdiffを実行し、結果を確認してください。 –

1

他のプログラムでソースファイルを確認してください。&や何らかの種類のエンコーディングに問題があっても、誤って保存した可能性があります。率直に言って、私はこのサイズのエラーがGCCには存在しないとは思っていません。実際、この行動が可能であるかどうかは疑問です。

以下の設定で、ここで期待どおりに動作:

Using built-in specs. 
COLLECT_GCC=g++ 
COLLECT_LTO_WRAPPER=c:/mingw/bin/../libexec/gcc/mingw32/4.5.2/lto-wrapper.exe 
Target: mingw32 
Configured with: ../gcc-4.5.2/configure --enable-languages=c,c++,ada,fortran,objc,obj-c++ --disable-sjlj-exceptions --with-dwarf2 --enable-shared --enable-libgomp --disable-win32-registry --enable-libstdcxx-debug --enable-version-specific-runtime-libs --disable-werror --build=mingw32 --prefix=/mingw 
Thread model: win32 
gcc version 4.5.2 (GCC) 
関連する問題