In C ++ 11 wurde eine sehr praktische Funktion eingeführt, die als Raw-String-Literale bezeichnet wird. Hierbei handelt es sich um Strings ohne Escape-Zeichen. Und anstatt dies zu schreiben:
regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB");
Sie können dies einfach schreiben:
regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)");
Ziemlich lesbarer. Beachten Sie jedoch zusätzliche Klammern um die Zeichenfolge, die platziert werden müssen, um ein rohes Zeichenfolgenliteral zu definieren.
Meine Frage ist, warum brauchen wir diese überhaupt? Für mich sieht es ziemlich hässlich und unlogisch aus. Hier sind die Nachteile, die ich sehe:
- Zusätzliche Ausführlichkeit, während die gesamte Funktion verwendet wird, um Literale kompakter zu gestalten
- Schwer zu unterscheiden zwischen dem Körper des Literal und den definierenden Symbolen
Das meine ich mit der harten Unterscheidung:
"good old usual string literal"
^- body inside quotes -^
R"(new strange raw string literal)"
^- body inside parenthesis -^
Und hier ist der Profi:
- Mehr Flexibilität, mehr Zeichen in rohen Zeichenfolgen verfügbar, insbesondere bei Verwendung mit dem Trennzeichen:
"delim( can use "()" here )delim"
Aber hey, wenn Sie mehr Flexibilität benötigen, haben Sie alte, gute, flüchtige String-Literale. Warum hat das Standardkomitee beschlossen, den Inhalt jedes rohen String-Literals mit diesen absolut unnötigen Klammern zu verschmutzen? Was war der Grund dafür? Was sind die Profis, die ich nicht erwähnt habe?
UPD Die Antwort von Kerrek ist großartig, aber leider keine Antwort. Da ich bereits beschrieben habe, dass ich verstehe, wie es funktioniert und welche Vorteile es bietet. Fünf Jahre sind vergangen, seit ich diese Frage gestellt habe, und es gibt immer noch keine Antwort. Und diese Entscheidung frustriert mich immer noch. Man könnte sagen, dass dies Geschmackssache ist, aber ich würde nicht zustimmen. Wie viele Leerzeichen verwenden Sie, wie benennen Sie Ihre Variablen, ist dies SomeFunction()
oder some_function()
- das ist Geschmackssache. Und ich kann wirklich leicht von einem Stil zum anderen wechseln.
Aber das? .. fühlt sich nach so vielen Jahren immer noch unbeholfen und ungeschickt an. Nein, hier geht es nicht um den Geschmack. Hier geht es darum, wie wir alle möglichen Fälle abdecken wollen, egal was passiert. Wir waren dazu verdammt, diese hässlichen Parens jedes Mal zu schreiben, wenn wir einen Windows-spezifischen Pfad, einen regulären Ausdruck oder ein mehrzeiliges String-Literal schreiben müssen. Und wofür? .. Für die seltenen Fälle, in denen wir tatsächlich "
eine Zeichenfolge einfügen müssen? Ich wünschte, ich wäre auf dieser Ausschusssitzung, wo sie beschlossen hätten, dies auf diese Weise zu tun. Und ich wäre stark gegen diese wirklich schlechte Entscheidung. Ich wünsche. Jetzt sind wir zum Scheitern verurteilt.
Vielen Dank, dass Sie so weit gelesen haben. Jetzt geht es mir etwas besser.
UPD2 Hier sind meine alternativen Vorschläge, von denen ich denke, dass beide VIEL besser wären als die bestehenden.
Vorschlag 1. Inspiriert von Python. String-Literale mit dreifachen Anführungszeichen können nicht unterstützt werden:R"""Here is a string literal with any content, except for triple quotes, which you don't actually use that often."""
Vorschlag 2. Inspiriert vom gesunden Menschenverstand. Unterstützt alle möglichen String-Literale, genau wie das aktuelle : R"delim"content of string"delim"
. Mit leerem Trennzeichen : R""Looks better, doesn't it?""
. Leere Rohzeichenfolge : R""""
. Rohzeichenfolge mit doppelten Anführungszeichen : R"#"Here are double quotes: "", thanks"#"
.
Probleme mit diesen Vorschlägen?
R";-](R"(this is a basic raw string literal as text inside a more complex one)");-]"