2011-07-03 16 views
6

Estoy jugando con referencias en C++, y noté un comportamiento extraño que no puedo explicar. Mi entendimiento es que si tengo una variable no const y una referencia constante a esa misma variable y luego modifico la variable non-const, la referencia debería reflejar esa modificación.referente cambiante de const std :: string reference

Ejemplo:

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

produce la siguiente salida para mí:

x = 10 
y = 10 

Sin embargo, si cambio el tipo de std :: string, no parece que la referencia constante para reflejar la variable de modificación:

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; 
} 

produce lo siguiente para mí:

x = xyz 
y = abc 

¿Es este el comportamiento normal esperado al intentar esto con std :: string? (Estoy usando GCC 4.6.0; no tengo ningún otro compilador disponible en este momento, así que no sé si esto solo ocurre con esta versión específica o no).

+0

Ese código compilado con * g ++ - MP-4.6 (GCC) 4.6.0 * 20100814 impresiones 'xyz dos veces, me han tratado en diferentes niveles de optimización . ¿Has * copiado * el código exacto? –

+0

Funciona como esperaba para mí. ("xyz \ nxyz \ n"). Esto me lleva a pensar que hay un error BCAK o un error de copiar y pegar. Verifique su código y publique la versión completa compilable del código (** usando copiar y pegar **). –

+0

Gracias a todos por la información. Logré que funcionara de la manera que esperaba copiando y pegando a otro archivo. Cuando vi el original en modo binario, había una gran cantidad de bytes extraños ocultos antes de la "y" en mi declaración que solo puedo adivinar que de alguna manera estaba causando el problema. No sé cómo compiló así. Pero gracias a todos por ayudarme con esto. ¡Todos ustedes son geniales! – Bobby

Respuesta

10

Funciona muy bien y tal como esperaba para mí with GCC 4.3.4 y 4.5.1 así como fuera de línea con MSVC 10. No nos está mostrando el código que ejecuta, parece, o hay un error en 4.6.0 que no creo. ¿Estás seguro de que estás usando una referencia y no solo un const std::string en tu código real?

+0

La única parte de mi código que no se mostró fue el encabezado-archivo incluye, la declaración de foo() antes de main(), y main() que simplemente llamó a foo() y devolvió 0 al sistema. Reescribí esto en otro archivo, y se está comportando de la manera que esperaba ahora (es decir, y = xyz), así que supongo que algo está mal en el código original. – Bobby

+0

@Bobby: Probablemente haya alguna diferencia involuntaria de la que no se haya dado cuenta. Intenta realizar un diff de los dos archivos y ver el resultado. –

1

Compruebe el archivo fuente con algún otro programa, puede haberlo guardado accidentalmente sin el &, o algún tipo de problema de codificación. Francamente, dudo que algún error de este tamaño exista en GCC. De hecho, dudo que este comportamiento sea posible.

funciona como se espera aquí con la siguiente configuración:

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) 
Cuestiones relacionadas