Почему ограничители строк строковых литералов должны быть ниже 16 символов?
Следующая программа не компилируется:
#include <iostream>
int main() {
std::cout << R"RAW_STRING_LITERAL(
hello
world
)RAW_STRING_LITERAL";
}
ошибка: raw string delimiter longer than 16 characters
.
Почему существует ограничение длины на разделители строк?
Ответы
Ответ 1
Самое раннее предложение, которое я могу найти для сырых строковых литералов, N2146 от Beman Dawes. Он содержит текст:
Максимальная длина d- char -последовательности должна быть 16 символов.
Это, кажется, произвольный предел, наложенный автором, который, вероятно, решил, что 16 символов были достаточными для создания однозначной последовательности разделителей во всех случаях.
В заявлении также говорится
Конечная d- char -последовательность исходного строкового литерала должна быть той же последовательности символов, что и исходная d- char -sequence
Таким образом, соответствующая реализация должна буферизировать и обрабатывать d- char -последовательность, чтобы гарантировать соответствие двух последовательностей. Отсутствие какого-либо ограничения на d- char -последовательность излишне увеличивало бы сложность реализации этой функции.
Ответ 2
В стандарте указано, что:
Строковый литерал, который имеет R в префиксе, является строковым литералом. В качестве разделителя служит d- char -последовательность. Прекращение d- char -последовательность исходной строки - это та же последовательность символов, что и начальная d-charsequence. Последовательность d- char должна состоять не более 16 символов
http://open-std.org/JTC1/SC22/WG21/docs/papers/2015/n4527.pdf
§ 2.13.5 стр. 28
В стандарте нет никаких оснований, но для меня это выглядит как совершенно случайный предел, поскольку он не должен иметь абсолютно никакого отношения к тому, что такое разделитель.