5 Lexical conventions [lex]

5.13 Literals [lex.literal]

5.13.5 String literals [lex.string]

string-literal:
	encoding-prefixopt " s-char-sequenceopt "
	encoding-prefixopt R raw-string
s-char-sequence:
	s-char
	s-char-sequence s-char
s-char:
	any member of the source character set except
		the double-quote ", backslash \, or new-line character
	escape-sequence
	universal-character-name
raw-string:
	" d-char-sequenceopt ( r-char-sequenceopt ) d-char-sequenceopt "
r-char-sequence:
	r-char
	r-char-sequence r-char
r-char:
	any member of the source character set, except
		a right parenthesis ) followed by the initial d-char-sequence
		(which may be empty) followed by a double quote ".
d-char-sequence:
	d-char
	d-char-sequence d-char
d-char:
	any member of the basic source character set except:
		space, the left parenthesis (, the right parenthesis ), the backslash \,
		and the control characters representing horizontal tab,
		vertical tab, form feed, and newline.

string-literalПредставляет собой последовательность символов (как определено в[lex.ccon]) в двойных кавычках, при необходимости с приставкой R, u8, u8R, u, uR, U, UR, L, илиLR, как в "...", R"(...)", u8"...", u8R"**(...)**", u"...", uR"*~(...)*~", U"...", UR"zzz(...)zzz", L"...", илиLR"(...)", соответственно.

string-literal, Что имеет в префиксе это . Символ служит разделителем. Окончание a - это та же последовательность символов, что и начальная . А должен состоять максимум из 16 знаков.R raw string literald-char-sequenced-char-sequenceraw-stringd-char-sequenced-char-sequence

[ Note: Символы'(' и')' разрешены в raw-string. Таким образом,R"delimiter((a|b))delimiter" эквивалентно "(a|b)". ]end note

[ Note: Новая строка исходного файла в необработанном строковом литерале приводит к новой строке в результирующем строковом литерале выполнения. Предполагая, что в начале строк в следующем примере нет пробелов, утверждение будет успешным:

const char* p = R"(a\
b
c)";
assert(std::strcmp(p, "a\\\nb\nc") == 0);

end note]

[ Example: Необработанная строка

R"a(
)\
a"
)a"

эквивалентно"\n)\\\na\"\n". Необработанная строка

R"(??)"

эквивалентно"\?\?". Необработанная строка

R"#(
)??="
)#"

эквивалентно"\n)\?\?=\"\n". ]end example

После фазы трансляции 6 элемент a string-literal, который не начинается с символа encoding-prefixan ordinary string literal, инициализируется заданными символами.

string-literal, Который начинается сu8, таких какu8"asdf", являетсяUTF-8 string literal.

Обычные строковые литералы и строковые литералы UTF-8 также называются узкими строковыми литералами. Узкий строковый литерал имеет тип «массив изnconst char», гдеn - размер строки, как определено ниже, и имеетstatic storage duration.

Для строкового литерала UTF-8 каждый последующий элемент object representation имеет значение соответствующей кодовой единицы кодировки строки UTF-8.

A, string-literalкоторый начинается сu, напримерu"asdf", являетсяchar16_­t строковым литералом.char16_­t Строковый литерал имеет тип «массивnconst char16_­t», гдеn это размер строки , как определено ниже; он инициализируется заданными символами. Один c-charможет содержать более одногоchar16_­t символа в виде суррогатных пар.

A, string-literalкоторый начинается сU, напримерU"asdf", являетсяchar32_­t строковым литералом.char32_­t Строковый литерал имеет тип «массивnconst char32_­t», гдеn это размер строки , как определено ниже; он инициализируется заданными символами.

string-literal, Который начинается сL, таких какL"asdf", являетсяwide string literal. Широкий строковый литерал имеет тип «массив », где - размер строки, как определено ниже; он инициализируется заданными символами.nconst wchar_­tn

Вtranslation phase 6, смежные string-literals объединяются. Если оба string-literals имеют одинаковые значения encoding-prefix, полученный конкатенированный строковый литерал будет иметь это encoding-prefix. Если у одного string-literalнет encoding-prefix, он рассматривается как один string-literalиз тех же, encoding-prefixчто и другой операнд. Если токен строкового литерала UTF-8 соседствует с токеном широкого строкового литерала, программа имеет неправильный формат. Любые другие конкатенации условно поддерживаются с поведением, определяемым реализацией. [ Note: Эта конкатенация является интерпретацией, а не преобразованием. Поскольку интерпретация происходит на этапе перевода 6 (после того, как каждый символ строкового литерала был переведен в значение из соответствующего набора символов), string-literalисходная грубость a не влияет на интерпретацию или правильность конкатенации. ] В таблице есть несколько примеров допустимых конкатенаций.end note9

Таблица9 - конкатенации строковых литералов
Источник Средства Источник Средства Источник Средства
u"a" u"b" u"ab" U"a" U"b" U"ab" L"a" L"b" L"ab"
u"a" "b" u"ab" U"a" "b" U"ab" L"a" "b" L"ab"
"a" u"b" u"ab" "a" U"b" U"ab" "a" L"b" L"ab"

Символы в составных строках сохраняются отдельно.

[Example:

"\xA" "B"

содержит два символа'\xA' и'B' после объединения (а не один шестнадцатеричный символ '\xAB'). ]end example

После любой необходимой конкатенации к каждому строковому литералу добавляется intranslation phase 7,'\0' чтобы программы, просматривающие строку, могли найти ее конец.

Escape-последовательности и universal-character-names в необработанных строковых литералах имеют то же значение, что и вcharacter literals, за исключением того, что одинарная кавычка' может быть представлена ​​либо сама по себе, либо с помощью escape-последовательности \', а двойной кавычке" должен предшествовать a \, и за исключением того, что a universal-character-nameв char16_­t строковом литерале может дать суррогатную пару. В узком строковом литерале a universal-character-nameможет отображаться более чем на одинchar элемент из-заmultibyte encoding. Размерchar32_­t строкового литерала or - это общее количество управляющих последовательностей universal-character-names, и других символов, плюс один для завершающегоU'\0' или L'\0'. Размерchar16_­t строкового литерала - это общее количество управляющих последовательностей, universal-character-namesи других символов, плюс один для каждого символа, требующего суррогатной пары, плюс один для завершения u'\0'. [ Note: Размерchar16_­t строкового литерала - это количество кодовых единиц, а не количество символов. ] В и строки литералов, любой должен быть в пределах до . Размер узкого строкового литерала - это общее количество escape-последовательностей и других символов, плюс по крайней мере один для многобайтовой кодировки каждого , плюс один для завершения .end notechar32_­t char16_­tuniversal-character-names 0x0 0x10FFFFuniversal-character-name'\0'

string-literalРезультатом оценки является объект строкового литерала со статической продолжительностью хранения, инициализированный заданными символами, как указано выше. Все ли строковые литералы различны (то есть хранятся в неперекрывающихся объектах) и не определено ли последовательные вычисления одного и string-literalтого же объекта или другого объекта. [ Эффект от попытки изменить строковый литерал не определен. ]Note: end note