初始化后更改变量引用

时间:2014-03-24 21:53:12

标签: c++ c++11 standards

C++ standard中你可以阅读(8.5.3.2 pag.202)

  

“之后无法更改引用以引用其他对象   初始化“。

但是下面的代码呢

#include <iostream>
#include <functional>

int main(int argc, const char * argv[])
{
    int i = 1;
    int &j = i;

    j = 2; // Ok, now i == 2

    int k = 3;

    j = std::ref(k);

    std::cout << "j = " << j << ", i = " << i << std::endl;

    return 0;
}

产生此输出

j = 3, i = 3

真的错吗?是编译器的“功能”还是C ++语言的“功能”?我在mac(LLVM 5.1)和windows(VS2010)上编译了这段代码的片段。

1 个答案:

答案 0 :(得分:6)

该行

 j = std::ref(k);

具有完全相同的效果

 j = k

这是在std::ref(k)分配给k之前隐式取消引用引用i。所以难怪你所看到的行为。作为证明,只需将代码更改为

即可
int i = 1;
int &j = i;
j = 2; // Ok, now i == 2
int k = 3;
j = std::ref(k);
std::cout << "j = " << j << ", i = " << i << std::endl;
k = 5;
std::cout << "j = " << j << ", i = " << i << std::endl;

然后输出

j = 3, i = 3
j = 3, i = 3

表明j不是对k的引用。更改k不会更改j