Следующая программа не компилируется:
#include <iostream>
int main() {
std::cout << R"RAW_STRING_LITERAL(
hello
world
)RAW_STRING_LITERAL";
}
ошибка: raw string delimiter longer than 16 characters
,
Почему на необработанные разделители строк накладывается ограничение длины?
Самое раннее предложение, которое я могу найти для строковых литералов: N2146 Беман Дауэс. Содержит текст:
Максимальная длина d-символ последовательности должно быть 16 символов.
Это, кажется, произвольное ограничение, наложенное автором, который, вероятно, решил, что 16 символов было достаточно для создания однозначной последовательности разделителя во всех случаях.
В предложении также говорится
Завершающий d-символ последовательности необработанного строкового литерала должен быть той же последовательности символов, что и начальный d-символ последовательности
Таким образом, соответствующая реализация должна буферизовать и обрабатывать d-символ последовательности чтобы убедиться, что две последовательности совпадают. Отсутствие каких-либо ограничений на d-символ последовательности излишне усложнит реализацию функции.
Стандарт определяет, что:
Строковый литерал с префиксом 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
В стандарте нет причин, но для меня это выглядит как абсолютно случайный предел, так как он не должен иметь абсолютно никакого значения, каков разделитель.