Heim >Backend-Entwicklung >C++ >Warum lässt C bei impliziten Typkonvertierungen nur eine benutzerdefinierte Konvertierung zu?
C Implizite Konvertierungen: Benutzerdefinierte Konvertierungsregeln verstehen
Angesichts des aktuellen Feedbacks zu einer früheren Antwort ist es wichtig, das Verständnis zu klären von impliziten Konvertierungen in C.
Bedenken Sie den folgenden Codeausschnitt:
<code class="c++">#include <string> struct A { A(const std::string &s) {} }; void func(const A &a) { } int main() { func("one"); // error func(A("two")); // ok func(std::string("three")); // ok }</code>
Der erste Funktionsaufruf führt zu einem Fehler, da keine direkte Konvertierung von einem const char* in ein A erfolgt. Obwohl es eine Konvertierung von einer Zeichenfolge in ein A gibt, wären bei deren Anwendung mehrere Konvertierungen erforderlich, was nicht zulässig ist.
Der C-Standard (SC22-N-4411.pdf) liefert die Antwort in Abschnitt 12.3.4 mit dem Titel „Konvertierungen“:
"4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value."
Dies bedeutet, dass bei impliziten Typkonvertierungen oder Initialisierungen nur eine implizite benutzerdefinierte Konvertierung (entweder ein Konstruktor oder eine Konvertierungsfunktion) auf einen einzelnen Wert angewendet werden kann.
Im angegebenen Code versucht der erste Funktionsaufruf, func("one"), eine implizite Konvertierung von const char* „one“ nach A zu verwenden, was jedoch fehlschlägt, da hierfür zwei Konvertierungen erforderlich sind (eine von const char * nach std::string und ein weiteres von std::string nach A). Die anderen beiden Funktionsaufrufe sind gültig, da sie jeweils nur eine implizite Konvertierung beinhalten.
Das obige ist der detaillierte Inhalt vonWarum lässt C bei impliziten Typkonvertierungen nur eine benutzerdefinierte Konvertierung zu?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!