16 Overloading [over]

16.5 Overloaded operators [over.oper]

16.5.8 User-defined literals [over.literal]

literal-operator-id:
	operator string-literal identifier
	operator user-defined-string-literal

В string-literalили user-defined-string-literal в a literal-operator-idне должно быть encoding-prefixи не должно быть никаких символов, кроме неявного завершения '\0'. ud-suffixИз user-defined-string-literalили identifierв literal-operator-idназывается literal suffix identifier. Некоторые буквальные идентификаторы суффиксов зарезервированы для будущей стандартизации; см [usrlit.suffix]. Объявление, в котором literal-operator-idиспользуется такой буквальный идентификатор суффикса, неправильно сформировано, диагностика не требуется.

Объявление, имеющее значение declarator-ida, literal-operator-idдолжно быть объявлением функции или шаблона функции в области пространства имен (это может быть friend function), явным экземпляром или специализацией шаблона функции или файлом using-declaration. Функция, объявленная с a, literal-operator-id- это literal operator. Шаблон функции, объявленный с помощью a, literal-operator-id - это literal operator template.

Объявление буквального оператора должно иметь parameter-declaration-clauseэквивалент одного из следующих:

const char*
unsigned long long int
long double
char
wchar_t
char16_t
char32_t
const char*, std::size_t
const wchar_t*, std::size_t
const char16_t*, std::size_t
const char32_t*, std::size_t

Если у параметра есть default argument, программа имеет неправильный формат.

A raw literal operator - это буквальный оператор с одним параметром типа const char*.

Объявление шаблона литерального оператора должно иметь пустое значение, parameter-declaration-clauseа в нем template-parameter-listдолжен быть единственный шаблон, не являющийся template-parameterшаблоном типа parameter pack с типом элемента char.

Литеральные операторы и шаблоны буквальных операторов не должны иметь привязки к языку C.

[ Note: Литеральные операторы и шаблоны буквальных операторов обычно неявно вызываются через user-defined literals. Однако, за исключением ограничений, описанных выше, они являются обычными функциями области пространства имен и шаблонами функций. В частности, они выглядят как обычные функции и шаблоны функций и следуют тем же правилам разрешения перегрузки. Кроме того, они могут быть объявлены inline или constexprмогут иметь внутреннюю или внешнюю связь, могут вызываться явно, их адреса могут быть взяты и т. Д. ] end note

[Example:

void operator "" _km(long double);                  // OK
string operator "" _i18n(const char*, std::size_t); // OK
template <char...> double operator "" _\u03C0();    // OK: UCN for lowercase pi
float operator ""_e(const char*);                   // OK
float operator ""E(const char*);                    // error: reserved literal suffix ([usrlit.suffix], [lex.ext])
double operator""_Bq(long double);                  // OK: does not use the reserved identifier _­Bq ([lex.name])
double operator"" _Bq(long double);                 // uses the reserved identifier _­Bq ([lex.name])
float operator " " B(const char*);                  // error: non-empty string-literal
string operator "" 5X(const char*, std::size_t);    // error: invalid literal suffix identifier
double operator "" _miles(double);                  // error: invalid parameter-declaration-clause
template <char...> int operator "" _j(const char*); // error: invalid parameter-declaration-clause
extern "C" void operator "" _m(long double);        // error: C language linkage

end example]