Heim  >  Artikel  >  Backend-Entwicklung  >  Warum lässt C bei impliziten Typkonvertierungen nur eine benutzerdefinierte Konvertierung zu?

Warum lässt C bei impliziten Typkonvertierungen nur eine benutzerdefinierte Konvertierung zu?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-01 01:14:28539Durchsuche

Why Does C   Allow Only One User-Defined Conversion During Implicit Type Conversions?

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!

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