Heim > Artikel > Backend-Entwicklung > Warum verursacht `func(\"one\")` einen Fehler bei impliziten C-Konvertierungen?
Implizite C-Konvertierungen
Im Kontext von C war das Konzept der impliziten Konvertierungen Gegenstand von Diskussionen. Eine aktuelle Antwort zum Thema „Welche anderen nützlichen Casts können in C verwendet werden?“ warf Fragen zum korrekten Verständnis von Konvertierungen in C auf.
Bedenken Sie das folgende Code-Snippet:
<code class="cpp">#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>
In diesem Snippet führt der erste Funktionsaufruf, func("one"), zu ein Fehler. Dies liegt daran, dass es keine direkte Konvertierung von einem const char * in ein A gibt. Während es eine Konvertierung von einem String in ein A gibt, würde die Verwendung mehrere implizite Konvertierungen erfordern, was gemäß C-Standards nicht zulässig ist.
Der C-Standard (SC22-N-4411.pdf) in Abschnitt 12.3.4 „Konvertierungen“ besagt:
4 At most one user-defined conversion (constructor or conversion function) is implicitly applied to a single value.
Dies bedeutet, dass bei der Durchführung einer Konvertierung nur eine implizite benutzerdefinierte Konvertierung angewendet werden kann . Im ersten Funktionsaufruf sind sowohl die Konvertierung von const char * nach string als auch die Konvertierung von string nach A benutzerdefinierte Konvertierungen. Da mehr als eine Konvertierung erforderlich ist, gibt der Compiler einen Fehler aus.
Das obige ist der detaillierte Inhalt vonWarum verursacht `func(\"one\")` einen Fehler bei impliziten C-Konvertierungen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!