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 example ud-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 и этот суффикс применяется к результату конкатенации.