Heim  >  Artikel  >  Backend-Entwicklung  >  Warum gibt `Output::Print(\"Hello World\")` \"True\" anstelle von \"Hello World\" aus?

Warum gibt `Output::Print(\"Hello World\")` \"True\" anstelle von \"Hello World\" aus?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 06:53:02800Durchsuche

Why does `Output::Print(

String-Literal-Überladungskonflikt: Bool vs. std::string

In C können Klassenmethoden überladen werden, um verschiedene Parametertypen zu akzeptieren Möglicherweise stimmte unerwartet mit der booleschen Typüberladung statt mit der erwarteten std::string-Überladung überein.

Problembeschreibung:

Angenommen, wir haben eine Ausgabeklasse, die wie folgt definiert ist:

<code class="cpp">class Output
{
public:
    static void Print(bool value)
    {
        std::cout << (value ? "True" : "False");
    }

    static void Print(std::string value)
    {
        std::cout << value;
    }
};</code>

Beim Aufruf von Output::Print("Hello World ") ist das Ausgabeergebnis „True“ anstelle des erwarteten „Hello World“.

Problemanalyse:

Obwohl wir die std::string-Überladung definiert haben, ist „Hello World“ tatsächlich eine Zeichenarray-Konstante, die implizit in bool konvertiert werden kann. Der Compiler bevorzugt diese Standardkonvertierung gegenüber dem benutzerdefinierten std::string-Konvertierungskonstruktor.

Gemäß dem C-Standard (§13.3.3.2/2) haben Standard-Konvertierungsaufträge Vorrang vor benutzerdefinierten Konvertierungsaufträgen. Daher wählt der Compiler die Bool-Überladung, da diese eine bessere Konvertierungsreihenfolge aufweist.

Problemumgehung:

Um die std::string-Überladung explizit aufzurufen, müssen wir „Hello World“ explizit als std::string:

übergeben
<code class="cpp">Output::Print(std::string("Hello World"));</code>

Das obige ist der detaillierte Inhalt vonWarum gibt `Output::Print(\"Hello World\")` \"True\" anstelle von \"Hello World\" aus?. 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