2013-05-14 34 views
17

我想了解std :: ref是如何工作的。reference_wrapper和std :: ref如何工作?

#include <functional> 
#include <iostream> 

template <class C> 
void func(C c){ 
    c += 1; 
} 

int main(){ 
    int x{3}; 
    std::cout << x << std::endl; 
    func(x); 
    std::cout << x << std::endl; 
    func(std::ref(x)); 
    std::cout << x << std::endl; 
} 

Output : 3 3 4 

在上面的代碼,我認爲第三函數調用模板參數C被實例化std::reference_wrapper<int>。 閱讀時the reference, 我注意到std::reference_wrapper<int>中沒有+=運算符。 那麼,c += 1;如何有效?

回答

18

c += 1;怎麼樣有效?

由於reference_wrapper<int>隱式轉換爲經由其轉換運算符int&;如果操作數類型本身沒有合適的重載,則對操作數進行隱式轉換。

+0

然後,c仍然是reference_wrapper ,對吧? – Sungmin 2013-05-14 11:54:51

+0

@Sungmin:的確,'c'本身不能改變類型;但'+ ='應用於'c.operator int&()'的結果,該結果將成爲'reference_wrapper'目標的引用。 – 2013-05-14 11:56:27

+0

謝謝,我明白了。 – Sungmin 2013-05-14 11:59:00

12

std::reference_wrapper<T>有一個conversion operatorT&。這意味着在你的例子中std :: reference_wrapper可以隱式轉換爲int&

+0

這兩個答案几乎在同一時間上傳。但是Mike Seymour的回答更快一點。除此之外,我無法確定選擇哪一個。對不起。不管怎麼說,還是要謝謝你。 – Sungmin 2013-05-14 12:02:11

+1

@Sungmin不客氣。我認爲西摩的答案是更好的:他解釋了操作員超載和操作數,我沒有做到。 – juanchopanza 2013-05-14 12:17:31

相關問題