Подтвердить что ты не робот

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

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

#include <iostream>

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

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

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

4b9b3361

Ответ 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

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