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? }
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!