Почему разделители необработанных строковых литералов должны быть не более 16 символов?

Следующая программа не компилируется:

#include <iostream>

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

ошибка: raw string delimiter longer than 16 characters,

Почему на необработанные разделители строк накладывается ограничение длины?

11

Решение

Самое раннее предложение, которое я могу найти для строковых литералов: N2146 Беман Дауэс. Содержит текст:

Максимальная длина d-символ последовательности должно быть 16 символов.

Это, кажется, произвольное ограничение, наложенное автором, который, вероятно, решил, что 16 символов было достаточно для создания однозначной последовательности разделителя во всех случаях.

В предложении также говорится

Завершающий d-символ последовательности необработанного строкового литерала должен быть той же последовательности символов, что и начальный d-символ последовательности

Таким образом, соответствующая реализация должна буферизовать и обрабатывать d-символ последовательности чтобы убедиться, что две последовательности совпадают. Отсутствие каких-либо ограничений на d-символ последовательности излишне усложнит реализацию функции.

10

Другие решения

Стандарт определяет, что:

Строковый литерал с префиксом R является необработанным строковым литералом.
D-char-последовательность служит разделителем. Завершающий
d-char-последовательность необработанной строки — это та же последовательность символов, что и
начальная d-последовательность символов. Последовательность d-char должна содержать не более
16 символов

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

В стандарте нет причин, но для меня это выглядит как абсолютно случайный предел, так как он не должен иметь абсолютно никакого значения, каков разделитель.

1

По вопросам рекламы [email protected]