5 Lexical conventions [lex]

5.13 Literals [lex.literal]

5.13.8 User-defined literals [lex.ext]

user-defined-literal:
	user-defined-integer-literal
	user-defined-floating-literal
	user-defined-string-literal
	user-defined-character-literal
user-defined-integer-literal:
	decimal-literal ud-suffix
	octal-literal ud-suffix
	hexadecimal-literal ud-suffix
	binary-literal ud-suffix
user-defined-floating-literal:
	fractional-constant exponent-partopt ud-suffix
	digit-sequence exponent-part ud-suffix
	hexadecimal-prefix hexadecimal-fractional-constant binary-exponent-part ud-suffix
	hexadecimal-prefix hexadecimal-digit-sequence binary-exponent-part ud-suffix
user-defined-string-literal:
	string-literal ud-suffix
user-defined-character-literal:
	character-literal ud-suffix
ud-suffix:
	identifier

Если токен соответствует обоим user-defined-literalи другому literalтипу, он считается последним. [ Example:123_­km - это user-defined-literal, но12LL это - integer-literal. ] Синтаксический нетерминал, предшествующий в a, считается самой длинной последовательностью символов, которая может соответствовать этому нетерминальному.end exampleud-suffixuser-defined-literal

A user-defined-literalрассматривается как вызовliteral operator или literal operator template. Чтобы определить форму этого вызова для заданного user-defined-literalL с ud-suffixX, literal-operator-idищется буквальный идентификатор суффиксаX в контекстеL использования правил дляunqualified name lookup. ПозвольтеS быть набором объявлений, найденных этим поиском.S не должно быть пустым.

ЕслиL это a user-defined-integer-literal, пустьn будет буквальным без его ud-suffix. ЕслиS содержит буквальный оператор с типом параметраunsigned long long, литералL обрабатывается как вызов формы

operator "" X(nULL)

В противном случаеS должен содержать araw literal operator или a, literal operator template но не оба сразу. ЕслиS содержит необработанный буквальный оператор, литералL рассматривается как вызов формы

operator "" X("n")

В противном случае (S содержит шаблон буквального оператора)L рассматривается как вызов формы

operator "" X<'c1', 'c2', ... 'ck'>()

гдеn - исходная последовательность символовc1c2...ck. [ Note: Последовательность c1c2...ck может содержать только символы из базового исходного набора символов. ]end note

ЕслиL это a user-defined-floating-literal, пустьf будет буквальным без его ud-suffix. ЕслиS содержит буквальный оператор с типом параметраlong double, литералL обрабатывается как вызов формы

operator "" X(fL)

В противном случаеS должен содержать araw literal operator или a, literal operator template но не оба сразу. ЕслиS содержит необработанный буквальный оператор, literalL рассматривается как вызов формы

operator "" X("f")

В противном случае (S содержит шаблон буквального оператора)L рассматривается как вызов формы

operator "" X<'c1', 'c2', ... 'ck'>()

гдеf - исходная последовательность символовc1c2...ck. [ Note: Последовательность c1c2...ck может содержать только символы из базового исходного набора символов. ]end note

ЕслиL - a user-defined-string-literal, пустьstr будет литералом без его, ud-suffixа пустьlen будет числом кодовых единиц вstr (т. Е. Его длиной, исключая завершающий нулевой символ). ЛитералL рассматривается как вызов формы

operator "" X(str, len)

ЕслиL это a user-defined-character-literal, пустьch будет буквальным без его ud-suffix. S должен содержатьliteral operator , единственный параметр которого имеет тип,ch а литералL обрабатывается как вызов формы

operator "" X(ch)

[Example:

long double operator "" _w(long double);
std::string operator "" _w(const char16_t*, std::size_t);
unsigned operator "" _w(const char*);
int main() {
  1.2_w;      // calls operator "" _­w(1.2L)
  u"one"_w;   // calls operator "" _­w(u"one", 3)
  12_w;       // calls operator "" _­w("12")
  "two"_w;    // error: no applicable literal operator
}

end example]

Вtranslation phase 6смежные строковые литералы объединяются и user-defined-string-literals для этой цели считаются строковыми литералами. Во время конкатенации ud-suffixes удаляются и игнорируются, и происходит процесс конкатенации, как описано в[lex.string]. В конце фазы 6, если строковый литерал является результатом конкатенации, включающей хотя бы один user-defined-string-literal, все участвующие user-defined-string-literals должны иметь то же самое, ud-suffix и этот суффикс применяется к результату конкатенации.

[Example:

int main() {
  L"A" "B" "C"_x; // OK: same as L"ABC"_­x
  "P"_x "Q" "R"_y;// error: two different ud-suffixes
}

end example]