2015-07-28 16 views
10

Così pochi giorni fa ho imparato a conoscere std :: addressof. A http://en.cppreference.com/w/cpp/memory/addressof è dato una possibile implementazione:std :: addressof - strana implementazione

template< class T > 
T* addressof(T& arg) 
{ 
    return reinterpret_cast<T*>(
       &const_cast<char&>(
        reinterpret_cast<const volatile char&>(arg))); 
} 

Per quanto vedo questo può semplicemente essere implementato come:

template<typename T> 
T* addressof(T& var) 
{ 
    return &var; 
} 

Perché i ragazzi di cppreference ha scelto per la sua attuazione con 3 calchi? C'è qualche dettaglio che mi manca che sta migliorando la loro implementazione. Che senso ha usare volatile quando tutto ciò che fai è lanciato?

+1

Il sovraccarico dell'indirizzo dell'operatore interrompe la seconda implementazione. – SirGuy

+0

diamo un'occhiata anche a questo: http://stackoverflow.com/questions/6494591/how-can-i-reliable-get-the-address-of-an-object/6495205#6495205 – NathanOliver

risposta

7

Se potrebbe essere implementato come nel tuo esempio, non ce ne sarebbe bisogno. Il punto è che ti dà l'indirizzo di un oggetto, anche se l'indirizzo di operator& per quel tipo è stato sovraccaricato.

+0

Aha vedo. E qual è il punto di casting per const volatile e, invece di solo char &? – GeneralFailure

+0

@GeneralFailure Ciò consente di passare lvalues ​​'const' o' volatile' qualificati. Puoi provare a rimuoverlo per vedere. – juanchopanza

Problemi correlati