String-Literal-Mehrdeutigkeit beim Überladen von Funktionen mit bool
Beim Definieren überladener Methoden, die sowohl bool- als auch std::string-Argumente akzeptieren, kann es zu Problemen kommen unerwartetes Verhalten bei der Bereitstellung von Zeichenfolgenliteralen. Anstatt die std::string-Überladung aufzurufen, wird die bool-Überladung priorisiert.
Um dieses Verhalten zu verstehen, betrachten Sie die folgende Situation:
<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; } }; Output::Print("Hello World");</code>
Obwohl ein String-Literal bereitgestellt wird, wird das Print( )-Methode mit der Bool-Überladung wird aufgerufen. Dies liegt daran, dass String-Literale in C implizit in Bool-Werte konvertiert werden können. Konkret handelt es sich bei „Hello World“ um ein const char*-Array, das als Zeiger auf ein const char interpretiert werden kann, das wiederum implizit in einen bool umgewandelt werden kann. Diese Konvertierung wird als Standardkonvertierungssequenz betrachtet.
C priorisiert Standardkonvertierungssequenzen gegenüber benutzerdefinierten Konvertierungen (z. B. die Konvertierung von std::string nach bool). Gemäß dem C-Standard (§13.3.3.2/2) wird eine Standardkonvertierungssequenz immer als bessere Konvertierungssequenz angesehen.
Dieses Verhalten kann geändert werden, indem dem Print( explizit ein std::string-Argument bereitgestellt wird. ) Methode:
<code class="cpp">Output::Print(std::string("Hello World"));</code>
Das obige ist der detaillierte Inhalt vonWarum löst ein String-Literal die „bool'-Überladung bei der Funktionsüberladung aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!