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, инициализируется заданными символами.
Обычные строковые литералы и строковые литералы 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 note 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 note char32_t char16_tuniversal-character-names 0x0 0x10FFFFuniversal-character-name'\0'
string-literalРезультатом оценки является объект строкового литерала со статической продолжительностью хранения, инициализированный заданными символами, как указано выше. Все ли строковые литералы различны (то есть хранятся в неперекрывающихся объектах) и не определено ли последовательные вычисления одного и string-literalтого же объекта или другого объекта. [ Эффект от попытки изменить строковый литерал не определен. ] Note: — end note