2014-03-24 33 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