Was ist der Grund für Klammern in C ++ 11 Raw String Literalen R "(...)"?
Es ist eine sehr praktische Funktion eingeführt, die in C++11 genannte raw-string-Literale, strings ohne escape-Zeichen. Und statt zu schreiben:
regex mask("\\t[0-9]+\\.[0-9]+\\t\\\\SUB");
Können Sie einfach schreiben:
regex mask(R"(\t[0-9]+\.[0-9]+\t\\SUB)");
Ganz mehr lesbar. Beachten Sie jedoch, zusätzliche Klammern um den string zu legen, zu definieren, eine raw-string-Literale.
Meine Frage ist, warum brauchen wir überhaupt diese? Für mich sieht es ziemlich hässlich und unlogisch. Hier sind die Nachteile, was ich sehe:
- Extra Ausführlichkeit, während die ganze Funktion wird verwendet, um Literale kompakter
- Schwer zu unterscheiden zwischen dem Körper der wörtlichen und der Definition der Symbole
Das ist, was ich meine, durch die schwer zu unterscheiden:
"good old usual string literal"
^- body inside quotes -^
R"(new strange raw string literal)"
^- body inside parenthesis -^
Und hier ist der pro:
- Mehr Flexibilität, mehr Zeichen zur Verfügung, im raw-strings, vor allem, wenn verwendet mit Trennzeichen:
"delim( can use () here )delim"
Aber hey, wenn Sie mehr Flexibilität benötigen, haben Sie alte gute escapeable string-Literale. Warum die standard-Ausschuss hat beschlossen, die Umwelt zu verunreinigen den Inhalt jedes raw-string-Literale mit diesen absolut unnötigen Klammern? Was war die überlegung dahinter? Was sind die pros, die ich nicht erwähnt habe?
InformationsquelleAutor der Frage Mikhail | 2013-09-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Zweck der Klammern ist Ihnen zu erlauben, geben Sie ein benutzerdefiniertes Trennzeichen:
In deinem Beispiel und in den typischen Einsatz, das Trennzeichen ist einfach leer, so dass die raw-string eingeschlossen ist, die durch die Sequenzen
R"(
und)"
.So dass für beliebige Trennzeichen ist eine design-Entscheidung, das spiegelt sich der Wunsch, eine komplette Lösung ohne komische Einschränkungen oder Sonderfälle. Sie können wählen alle Folge von Zeichen, die nicht auftreten, in Ihrem string als Trennzeichen.
Ohne, würden Sie in Schwierigkeiten geraten, wenn der string selbst enthielt etwas wie
"
(wenn Sie nur wolltenR"..."
als raw-string-syntax) oder)"
(wenn das Trennzeichen ist leer). Diese beiden sind durchaus üblich und häufige Sequenzen von Zeichen, vor allem in regulären Ausdrücken, so wäre es unglaublich ärgerlich, wenn die Entscheidung, ob oder nicht Sie verwenden eine raw-string hing auf den konkreten Inhalt der Zeichenfolge.Denken Sie daran, dass im raw-string es gibt keine andere escape-Mechanismus, so dass die beste Sie tun könnten, ansonsten war zu verketten, Stücke von string-literal, das wäre sehr unpraktisch. Indem Sie eine benutzerdefinierte Trennzeichen, alles, was Sie tun müssen ist, wählen eine ungewöhnliche Zeichenfolge einmal, und vielleicht ändern Sie es in sehr seltenen Fällen, wenn Sie eine Zukunft Bearbeiten.
Aber noch einmal betonen, auch die empty delimiter ist schon sinnvoll, da die
R"(...)"
syntax ermöglicht es Ihnen, um nackt Anführungszeichen in deinem string. Das allein ist schon eine Verstärkung.InformationsquelleAutor der Antwort Kerrek SB