Unäres Plus (+) gegen Literal-String

Lesezeit: 2 Minuten

Unares Plus gegen Literal String
Alex Wilke

Heute habe ich einen Ausdruck geschrieben:

"<" + message_id + "@" +  + ">"
                          ^
                          |
                          \____  see that extra '+' here!

und war überrascht, dass es tatsächlich kompiliert wurde. (PS message_id ist ein QStringes würde auch mit einer funktionieren std::string)

Ich mache oft solche Dinge, lasse eine Variable aus, während ich arbeite, und erwarte, dass der Compiler mir sagt, wo mir noch Einträge fehlen. Das Finale würde in etwa so aussehen:

"<" + message_id + "@" + network_domain + ">"

Jetzt würde ich gerne wissen, warum die + Unärer Operator ist gegen ein String-Literal gültig!?

  • Welcher Typ ist message_id?

    – klm123

    7. Dezember 2013 um 8:44 Uhr

  • Zeigerarithmetik wahrscheinlich.

    – Raptz

    7. Dezember 2013 um 8:45 Uhr

  • @ klm123 Ich habe die Frage aktualisiert.

    – Alexis Wilke

    7. Dezember 2013 um 8:45 Uhr

Unares Plus gegen Literal String
Prost und hth. – Alf

Einstellig + kann auf arithmetische Typwerte, Aufzählungswerte ohne Bereich und Zeigerwerte angewendet werden, weil …

der C++-Standard definiert es so, in C++11 §5.3.1/7.

In diesem Fall das Zeichenfolgenliteral, das vom Typ Array of ist char constzerfällt in einen Zeiger auf char const.

Es ist immer eine gute Idee, sich die Dokumentation anzusehen, wenn man sich über die Funktionalität von etwas wundert.


„Der Operand des unären + Der Operator muss arithmetisch, eine Aufzählung ohne Bereich oder einen Zeigertyp haben und das Ergebnis ist der Wert des Arguments. Ganzzahlige Heraufstufung wird für ganzzahlige oder Aufzählungsoperanden durchgeführt. Der Typ des Ergebnisses ist der Typ des hochgestuften Operanden.“

  • Könnten Sie bitte C++11 §5.3.1/7 zitieren?

    – klm123

    7. Dezember 2013 um 8:51 Uhr

  • @AlexisWilke Du hast Recht. Ich bin mir nicht sicher, warum die + + kompiliert, und diese Antwort beantwortet es wirklich nicht.

    – Raptz

    7. Dezember 2013 um 8:57 Uhr

  • @Rapptz: C ++ folgt der “Maximum-Munch” -Regel, bei der der Lexer mitscannt, solange er über ein gültiges Token verfügt. Die Platz zwischen den beiden Instanzen von + bewirkt, dass der Lexer sie als zwei separate Token behandelt. Sie können also keine darstellen ++ Operator (und das OP ist sich dessen offensichtlich bewusst und fragt nach unären + er hat es als solches identifiziert und fragt sich nur, warum es auf eine wörtliche Zeichenfolge angewendet werden kann).

    – Prost und hth. – Alf

    7. Dezember 2013 um 9:00 Uhr


  • Ihre Antwort erklärt es nicht (für mich persönlich), und ich habe keine Lust, eine vollständige Antwort zu geben. Der Grund ist kompiliert, weil "<" + message_id + "@" würde dazu führen <test@ ist message_id ist test. Dann bleibt dir übrig message_id + + ">"das bedeutet, dass ">" (was vom Typ ist const char[2] zerfällt zu const char* was bedeutet, dass Sie mit links sind message_id + ">" mit ">" Als ein const char*. Ohne hätte der Ausdruck nicht funktioniert message_id. Das ist wirklich alles, was ich wissen wollte.

    – Raptz

    7. Dezember 2013 um 9:03 Uhr


  • Ich frage mich, was der Grund dafür war, Unary zuzulassen + auf Zeiger. Es ist nicht in C, aber es ist in C++98.

    – Ant

    7. Dezember 2013 um 9:04 Uhr

835020cookie-checkUnäres Plus (+) gegen Literal-String

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy