Heim > Backend-Entwicklung > C++ > Warum ersetzt der Compiler den Typ in Konvertierungsoperatoren nicht?

Warum ersetzt der Compiler den Typ in Konvertierungsoperatoren nicht?

Susan Sarandon
Freigeben: 2024-11-15 20:32:02
Original
560 Leute haben es durchsucht

Why Doesn't the Compiler Substitute Type in Conversion Operators?

Konvertierungsoperatoren in C verstehen

Bedenken Sie den folgenden Codeausschnitt:

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 doesn't the compiler try substituting Type?
}
Nach dem Login kopieren

In C spielen Konvertierungsoperatoren eine Rolle eine entscheidende Rolle bei Typkonvertierungen. Wie funktionieren sie also?

1. Konvertierung während der Argumentübergabe:

Konvertierungsoperatoren werden während der Argumentübergabe berücksichtigt und folgen den Kopierinitialisierungsregeln. Sie konvertieren den Quelltyp in einen beliebigen kompatiblen Typ, unabhängig davon, ob die Konvertierung in eine Referenz erfolgt oder nicht.

2. Konvertierung in eine Referenz:

Die Konvertierung in eine Referenz ist im Bedingungsoperator zulässig, wenn der konvertierte Typ ein L-Wert ist. Darüber hinaus kann die direkte Bindung einer Referenz auch die Umwandlung in eine Referenz beinhalten.

3. Konvertierung in Funktionszeiger:

Benutzerdefinierte Konvertierungen in Funktionszeiger oder Referenzen werden bei Funktionsaufrufen verwendet.

4. Konvertierung in Nicht-Klassentypen:

Implizite Konvertierungen, z. B. in boolesche Werte, können benutzerdefinierte Konvertierungsfunktionen verwenden.

5. Konvertierungsfunktionsvorlage:

Vorlagen können zum Erstellen von Konvertierungsfunktionen verwendet werden, die einen Typ in einen beliebigen Zeigertyp (außer Mitgliedszeigern) konvertieren.

Warum funktioniert der Compiler nicht? Typ ersetzen?

Im gegebenen Beispiel ersetzt der Compiler den Typ nicht, da der Konvertierungsoperator in smartref einen Zeiger auf zurückgibt das interne Datenelement. Beim Versuch, think() aufzurufen, schließt der Compiler, dass p ein Zeiger auf ein Personenobjekt und keine Referenz auf ein Personenobjekt ist. Daher erfolgt keine explizite Typersetzung.

Das obige ist der detaillierte Inhalt vonWarum ersetzt der Compiler den Typ in Konvertierungsoperatoren nicht?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage