Heim  >  Artikel  >  Backend-Entwicklung  >  Wann ersetzt der Compiler „Type&“ in C-Konvertierungsoperatoren?

Wann ersetzt der Compiler „Type&“ in C-Konvertierungsoperatoren?

DDD
DDDOriginal
2024-11-16 05:11:02332Durchsuche

When Does the Compiler Substitute `Type&` in C   Conversion Operators?

Konvertierungsoperatoren in C verstehen

Im Bereich der objektorientierten Programmierung spielen Konvertierungsoperatoren eine entscheidende Rolle bei der Überbrückung der Lücke zwischen verschiedenen Datentypen. Mit diesen Operatoren kann ein Objekt als ein anderer Typ behandelt werden, was seine Verwendbarkeit erweitert.

Betrachten Sie das folgende Beispiel, um zu veranschaulichen, wie Konvertierungsoperatoren funktionieren:

template <class Type>
class smartref {
public:
    smartref() : data(new Type) { }
    operator Type&() { return *data; }
private:
    Type* data;
};

class person {
public:
    void think() { std::cout << "I am thinking"; }
};

int main() {
    smartref<person> p;
    p.think(); // why does not the compiler try substituting Type&?
}

In diesem Beispiel handelt es sich um eine Smartref-Klasse Als Vorlagenklasse definiert, die eine Instanz eines beliebigen Typs enthalten kann. Der Konvertierungsoperator Operator Type&() wird implementiert, um das Smartref-Objekt in die zugrunde liegende Type-Referenz umzuwandeln.

Wenn der Compiler Type& ersetzt

Der Compiler ersetzt Type& im Konvertierungsoperator unter den folgenden Umständen:

  • Argumentübergabe: Wenn ein Objekt als Argument an eine Funktion übergeben wird, kann der Compiler Type& ersetzen, wenn die Funktion einen Verweis auf Type akzeptiert .
  • Referenzbindung:Wenn eine Referenz direkt an ein Objekt gebunden ist, kann der Compiler Type& ersetzen, wenn das Objekt ein L-Wert ist.
  • Funktionszeigerkonvertierung : Wenn ein Objekt in einen Funktionszeiger oder eine Referenz konvertiert wird, kann der Compiler Type& ersetzen, wenn der Funktionszeiger oder die Referenz mit der Signatur der Konvertierungsfunktion übereinstimmt.
  • Nicht-Klassen-Typkonvertierung: Der Compiler kann benutzerdefinierte Konvertierungsfunktionen verwenden, um Objekte in Nicht-Klassentypen wie Bool- oder Zeigerwerte zu konvertieren.
  • Vorlagenkonvertierungsoperatoren: Vorlagenkonvertierungsoperatoren ermöglichen Objekten dies in jeden Zeigertyp konvertierbar sein. Bei der Verwendung dieser Operatoren ist jedoch Vorsicht geboten, da sie zu Mehrdeutigkeiten führen können.

Im Fall des bereitgestellten Beispiels ersetzt der Compiler Type& nicht innerhalb des Funktionsaufrufs think(), da dieser aufgerufen wird auf ein Objekt vom Typ smartref, das kein lvalue-Verweis auf Type& ist.

Das obige ist der detaillierte Inhalt vonWann ersetzt der Compiler „Type&“ in C-Konvertierungsoperatoren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn