【问题标题】:changing referent of const std::string reference更改 const std::string 引用的引用
【发布时间】:2011-07-03 07:45:27
【问题描述】:

我正在使用 C++ 中的引用,并注意到一些我无法解释的奇怪行为。我的理解是,如果我有一个非常量变量和对同一变量的 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;我目前没有任何其他可用的编译器,所以我不知道这是否只发生在这个特定版本上。)

【问题讨论】:

  • g++-mp-4.6 (GCC) 4.6.0 20100814 编译的代码会打印两次xyz,我尝试过不同的优化级别。您是否复制确切的代码?
  • 按预期工作。 (“xyz\nxyz\n”)。这让我相信要么存在 BCAK 错误,要么存在复制和粘贴错误。请检查您的代码并发布代码的完整可编译版本(使用复制和粘贴)。
  • 感谢大家提供的信息。通过复制粘贴到另一个文件,我确实让它按照我期望的方式工作。当我以二进制模式查看原始文件时,在我的声明中的“&”之前隐藏了很多无关的字节,我只能猜测它们以某种方式造成了麻烦。我不知道它是怎么编译成这样的。但是感谢大家帮助我解决这个问题。你们都很棒!

标签: c++ reference constants


【解决方案1】:

工作完全正常,正如我所期望的 with GCC 4.3.44.5.1 以及使用 MSVC 10 离线。您似乎没有向我们展示您执行的代码,或者 4.6.0 中存在我不知道的错误不相信。您确定您在实际代码中实际使用的是引用,而不仅仅是 const std::string

【讨论】:

  • 我的代码中唯一没有显示的部分是头文件,包括在 main() 之前的 foo() 声明,以及简单调用 foo() 并返回 0 的 main()到系统。我在另一个文件中重写了它,它的行为与我现在所期望的一样(即 y = xyz),所以我猜原始代码中有些东西很奇怪?
  • @Bobby:可能有一些你没有意识到的意外差异。尝试执行两个文件的差异并查看结果。
【解决方案2】:

使用其他程序检查源文件,您可能在没有 & 或某种编码问题的情况下意外保存了它。坦率地说,我怀疑 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) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-11-10
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 2015-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多