2014-03-24 31 views
3

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)上编译了这段代码的片段。

回答

7

线

j = std::ref(k); 

具有完全相同的效果有

j = k 

这是参考std::ref(k) assignement到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

+0

+1,你在那里大肆渲染,我正要写出相同的答案。 Drat你是如此的快速和正确;) – blockchaindev

+0

@fixxxer:还有一个错字。我只是修复它。 – hivert