我正在玩C ++中的引用,并注意到一些我无法解释的奇怪行为。我的理解是,如果我有一个非const变量和一个const引用同一个变量,然后修改非const变量,引用应该反映该修改。
示例:
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 :: string,则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;
}
为我生成以下内容:
x = xyz
y = abc
使用std :: string尝试此操作时这是正常的预期行为吗? (我正在使用GCC 4.6.0;我目前没有任何其他编译器,所以我不知道这是否只发生在这个特定版本上。)
答案 0 :(得分:10)
完全正常,就像我预期with GCC 4.3.4和4.5.1以及离线MSVC 10一样。您没有向我们展示您执行它的代码,或者4.6中存在错误。 0,我不相信。您确定在实际代码中实际使用的是引用而不只是const std::string
吗?
答案 1 :(得分:1)
使用其他程序检查源文件,您可能在没有&amp;或某种编码问题的情况下意外保存了该文件。坦率地说,我怀疑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)