2013-05-14 13 views
17

Sto cercando di capire come funziona std :: ref.Come funzionano reference_wrapper e 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 

Nel codice di cui sopra, penso che il parametro di template C per la terza chiamata di funzione viene istanziato come std::reference_wrapper<int>. Durante la lettura di the reference, ho notato che non c'è l'operatore += in std::reference_wrapper<int>. Quindi, come è valido c += 1;?

risposta

18

come è valido c += 1;?

Perché reference_wrapper<int> è implicitamente convertibile in int& attraverso il suo operatore di conversione; e le conversioni implicite sono considerate per gli operandi se non esiste un sovraccarico adatto per il tipo di operando stesso.

+0

Quindi, c è ancora reference_wrapper , giusto? – Sungmin

+0

@Sungmin: Infatti, 'c' non può cambiare tipo; ma '+ =' viene applicato al risultato di 'c.operator int &()' che sarà un riferimento alla destinazione del 'reference_wrapper'. –

+0

Grazie, capisco. – Sungmin

12

std::reference_wrapper<T> ha un conversion operator a T&. Ciò significa che std :: reference_wrapper può essere convertito implicitamente in int& nell'esempio.

+0

Le due risposte sono state caricate quasi contemporaneamente. Ma la risposta di Mike Seymour è un po 'più veloce. A parte questo, non posso determinare quale scegliere. Perdonami per quello. Grazie comunque. – Sungmin

+1

@Sungmin Siete i benvenuti. Penso che la risposta di Seymour sia comunque migliore: spiega gli overload e gli operandi degli operatori, che non sono riuscito a fare. – juanchopanza

Problemi correlati