Da in C++, Stringliterale (wie "Hello"
sind nicht vom Typ std::string
. Sie sind schlicht char-Arrays oder C-Strings.
Also für die Linie const std::string message = "Hello" + ", world" + exclam;
, die Typen der Compiler, mit zu arbeiten sind :
const std::string message = const char[6] + const char[8] + std::string;
und die Assoziativität von +
gegeben, muss es die Operationen durchführen, sind:
const std::string message = ((const char[6] + const char[8]) + std::string);
Das heißt, die äußerste linke Addition muss zuerst ausgewertet werden, und das Ergebnis wird an die äußerste rechte Addition übergeben.
Also versucht der Compiler const char[6] + const char[8]
auszuwerten. Für Arrays ist kein Zusatz definiert. Arrays werden implizit in Zeiger umgewandelt, was dem Compiler jedoch nicht hilft. Das bedeutet nur, dass es mit const char* + const char*
endet, und für Zeiger wird kein Zusatz definiert.
An dieser Stelle weiß es nicht, dass das Ergebnis in eine std::string
konvertiert werden soll.
jedoch in Ihrem zweiten Beispiel:
const std::string hello = "Hello";
const std::string message = hello + ", world" + "!";
es funktioniert, weil die Operationen der Compiler sehen würde, waren std::string + const char[8] + const char[2]
. Hier kann die erste Addition in std::string + const char*
umgewandelt werden, und hier ist der Additionsoperator definiert und gibt eine std::string
zurück. So hat der Compiler die erste Addition erfolgreich herausgefunden, und da das Ergebnis eine Zeichenfolge war, sieht die zweite Addition wie folgt aus: std::string + const char[2]
, und wie zuvor ist dies nicht möglich, aber das Array kann in einen Zeiger und dann konvertiert werden Der Compiler ist in der Lage, einen Additionsoperator zu finden, der funktioniert, was wiederum zu einem std::string
führt.
Warum nicht tun: const std :: string message = "Hallo, Welt" + exclam; –
Willkommen auf der Website! Nur zum Glück, wenn es eine Antwort gibt, die Sie mögen, stellen Sie sicher, dass Sie es akzeptieren. Sie werden wahrscheinlich in Zukunft Hilfe bekommen. – JasCav