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, программа имеет неправильный формат.
Объявление шаблона литерального оператора должно иметь пустое значение, parameter-declaration-clauseа в нем template-parameter-listдолжен быть единственный шаблон, не являющийся template-parameterшаблоном типа parameter pack с типом элемента char.
[ 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 ]