2017-04-01 1 views
-1

Es ist aus Wikipedia, wenn unsere Compiler c nicht unterstützen ++ 11, können wir ein von uns selbst implementieren, wie unten:Benutzerdefiniert "nullptr", aber wie versteht man die Codes?

const class nullptr_t 
{ 
public: 
    template<class T> 
    inline operator T*() const 
     { return 0; } 

    template<class C, class T> 
    inline operator T C::*() const 
     { return 0; } 

private: 
    void operator&() const; 
} nullptr = {}; 

ich nicht die oben genannten Codes verstehen.

---------------------- Update ------------------

Entschuldigung Ich habe es nicht klar ausgedrückt.

template<class T> 
    inline operator T*() const 
     { return 0; } 

template<class C, class T> 
    inline operator T C::*() const 
     { return 0; } 

Die obigen Codes, verstehe ich nicht die Grammatik. ich noch nie diese Art von Schablonenform sehen. (Wie „Operator TC :: *()“)

+2

Welchen Teil verstehst du nicht? –

+0

Der Code definiert eine 'const'-Variable mit dem Namen' nullptr' vom Typ 'nullptr_t'. Die zwei impliziten Konvertierungsoperatoren ermöglichen es, daß 'nullptr' überall dort verwendbar ist, wo ein Zeiger verwendet werden kann. –

Antwort

3
template<class T> 
inline operator T*() const 
    { return 0; } 

bedeutet, dass ein Objekt vom Typ nullptr_t implizit in jeden (nicht Mitglied) Zeigertyp umgewandelt werden . Es ist einfach eine operator T *() Funktion (Umwandlung zu Typ T *), die für jeden Typ T templated ist.

template<class C, class T> 
inline operator T C::*() const 
    { return 0; } 

bedeutet, dass ein Objekt vom Typ nullptr_t kann auf einen Zeiger auf ein nicht statisches Mitglied einer Klasse (Template-Parameters C) jede Art (Template-Parameter T) umgewandelt werden.

Beide Operatoren sind const, also kann das nullptr_t Objekt nicht geändert werden.