2012-11-22 83 views
5

考慮下面的代碼:何時將std :: reference_wrapper轉換爲T&?

#include <iostream> 
#include <functional> 

using namespace std; 

template<class T> 
void fun(T t) 
{ 
    t+=8; 
} 


int main() 
{ 
    int i = 0; 
    fun(ref(i)); 
    cout << i << endl; 
} 

此代碼打印 「8」。我假設fun()中的t自動轉換爲int &。

但是,如果我將t+=8替換爲t=8,程序將無法編譯。

爲什麼?

回答

3

reference_wrapper<T>具有的隱式轉換操作者T &,所以它會被轉換爲T &無論一個T &reference_wrapper<T>更好的匹配。

在增強賦值表達式中,唯一可行的運算符是int &operator+=(int &, int),因此int &被提取。

在賦值表達式中,成員運算符reference_wrapper<int>::operator=(const reference_wrapper<int> &)也是可用的,所以成員運算符是首選的;編譯器會嘗試從常量8構造一個參考包裝,該包裝失敗。賦值運算符具有重新綁定的效果,這對像tie這樣的設施按預期工作是必需的。

這意味着引用包裝在像Python語言比C++引用接近引用:

#include <functional> 
#include <iostream> 

int main() { 
    int i = 1, j = 2; 
    std::ref(i) = j; 
    std::cout << i << '\n';     // prints '1' 
} 
+0

謝謝ecatmur,這是有道理的。 – oz1cz