2013-05-14 8 views
17

Próbuję zrozumieć, jak działa std :: ref.Jak działa reference_wrapper i 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 

W powyższym kodzie, myślę, że parametr szablonu C na trzecim wywołaniu funkcji jest tworzony jako std::reference_wrapper<int>. Podczas czytania the reference, Zauważyłem, że nie ma operatora += w std::reference_wrapper<int>. Zatem, jak ważna jest c += 1;?

Odpowiedz

18

jak ważna jest c += 1;?

Ponieważ reference_wrapper<int> niejawnie zamiany na int& poprzez jego operatora konwersji; i niejawne konwersje są rozważane dla argumentów, jeśli nie ma odpowiedniego przeciążenia dla samego typu argumentu.

+0

Następnie, c nadal jest plikiem referencyjnym , prawda? – Sungmin

+0

@Sungmin: Rzeczywiście sam 'c' nie może zmienić typu; ale '+ =' jest stosowane do wyniku 'c.operator int &()', który będzie odniesieniem do celu 'reference_wrapper'. –

+0

Dziękuję, rozumiem. – Sungmin

12

ma conversion operator na T&. Oznacza to, że std :: reference_wrapper może zostać niejawnie przekonwertowany na int& w twoim przykładzie.

+0

Dwie odpowiedzi zostały przesłane prawie w tym samym czasie. Ale odpowiedź Mike'a Seymoura jest trochę szybsza. Poza tym nie mogę określić, który wybrać. Przepraszam za to. Dzięki i tak. – Sungmin

+1

@Sungmin Nie ma za co. Myślę, że odpowiedź Seymoura jest jeszcze lepsza: wyjaśnia o przeciążeniach operatorów i operandach, których nie udało mi się wykonać. – juanchopanza

Powiązane problemy