2015-08-04 11 views
11

Das folgende Programm nicht kompiliert:Warum müssen die Trennzeichen von Raw-String-Literalen unter 16 Zeichen stehen?

#include <iostream> 

int main() { 
    std::cout << R"RAW_STRING_LITERAL(
     hello 
     world 
     )RAW_STRING_LITERAL"; 
} 

Fehler:raw string delimiter longer than 16 characters.

Warum gibt es eine Begrenzungslänge, die den String-Trennzeichen auferlegt wird?

+1

Denken Sie, dass es nicht sein sollte? –

+0

Die Auswahl scheint willkürlich aus den relevanten Vorschlagspapieren zu sein, aber ich werde die Antwort jemand anderem überlassen. –

+0

Dies könnte umsetzungsspezifisch sein. Welchen Compiler benutzen Sie? Welches OS? – ventsyv

Antwort

10

Der früheste Vorschlag, den ich für rohe Zeichenkettenliterale finden kann, ist N2146 von Beman Dawes. Es enthält den Text:

The maximum length of d-char-sequence shall be 16 characters.

Dies scheint vom Autor selbst auferlegt eine willkürliche Grenze zu sein, die wahrscheinlich entschieden 16 Zeichen für die Erstellung einer eindeutige Trennsequenz in allen Fällen ausreichend waren.

Der Vorschlag sieht auch

The terminating d-char-sequence of a raw string literal shall be the same sequence of characters as the initial d-char-sequence

So eine konforme Implementierung muss die d-Zeichen-Sequenz, um sicherzustellen, das zwei Sequenzen Spiel puffern und verarbeiten. Das Fehlen jeglicher Begrenzung der d-char-Sequenz würde unnötigerweise die Komplexität der Implementierung des Merkmals erhöhen.

1

Der Standard legt fest, dass:

A string-literal that has an R in the prefix is a raw string literal. The d-char-sequence serves as a delimiter. The terminating d-char-sequence of a raw-string is the same sequence of characters as the initial d-charsequence. A d-char-sequence shall consist of at most 16 characters

http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf § 2.13.5 Seite 28

Kein Grund in der Norm angegeben ist, aber für mich, dies als völlig zufällig Grenze erscheinen als es unbedingt machen sollte kein Unterschied was der Begrenzer ist.

+0

Ist ein Grund gegeben, oder können wir einfach davon ausgehen, dass die Länge willkürlich beschlossen wurde? (Ich meine nicht willkürlich auf eine negative Art und Weise, sondern einen wörtlichen Sinn.) –

+0

Das würde ich auch gerne wissen. –

+0

In einem der Anhänge legen sie untere Grenzen für Dinge wie die Anzahl der Vorlagenargumente und die Klassenverschachtelungstiefe fest. Diese * obere * Grenze, die im allgemeinen Standardtext erscheint, ist sehr ungewöhnlich. Dies scheint so zu sein, dass die maximale Zeichensequenz von 16 ein Minimum sein sollte und eine ID sein darf. – emsr