2015-08-04 11 views
11

Poniższy program nie kompiluje:Dlaczego separatory surowych literałów ciągów powinny być poniżej 16 znaków?

#include <iostream> 

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

błąd:raw string delimiter longer than 16 characters.

Dlaczego na surowych ogranicznikach napisów obowiązuje ograniczenie długości?

+1

Czy uważasz, że nie powinno być? –

+0

Wybór wydaje się arbitralny z odpowiednich dokumentów propozycji, ale pozostawiam odpowiedź komuś innemu. –

+0

Może to być konkretna implementacja. Który kompilator używasz? Jaki system operacyjny? – ventsyv

Odpowiedz

10

Najwcześniejszą propozycją, jaką mogę znaleźć w przypadku surowych literałów ciągów, jest N2146 autorstwa Bemana Dawesa. Zawiera tekst:

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

to wydaje się być arbitralne ograniczenie narzucone przez autora, który prawdopodobnie zdecydowała 16 znaków były wystarczające do stworzenia jednoznacznej sekwencji ogranicznika we wszystkich przypadkach.

Wniosek stanowi również

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

Więc Wykonanie zgodne musi buforować i przetwarzać d-char-sekwencję aby zapewnić dopasowanie dwóch sekwencji. Brak jakiegokolwiek limitu na sekwencji d-char niepotrzebnie zwiększyłby złożoność implementacji tej cechy.

1

Norma określa, że:

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 strona 28

Nie ma powodu, podana jest w normie, ale dla mnie, to pojawiają się jako całkowicie losowy limitu jak powinno bezwzględnie nie ma znaczenia, co to jest ogranicznik.

+0

Czy podano powód, czy możemy po prostu założyć, że długość została arbitralnie ustalona? (Nie mam na myśli arbitralności w negatywny sposób, ale dosłowny sens.) –

+0

Chciałbym też to wiedzieć. –

+0

W jednym z dodatków określają one dolne ograniczenie na takie rzeczy jak liczba argumentów szablonu i głębokość zagnieżdżania klasy. To * górne * ograniczenie pojawiające się w ogólnym tekście standardowym jest bardzo nietypowe. Wydaje się, że maksymalna sekwencja znaków 16 powinna być minimalna i może być identyfikatorem. – emsr

Powiązane problemy