Какие пользовательские литералы предопределены стандартом?

Мой вопрос звучит как противоречие, но я не знаю, как еще ссылаться на новый литерал, отличный от user-defined-literal.

std::string operator "" s ( const char* str, size_t len )
{
   return std::string( str, len );
}

assert( "foo"s == "bar"s );

Помню, что пользовательские литералы должны начинаться с префикса _. Это означало бы, что библиотека определяет некоторые не префиксные литералы для нас.

Предоставляет ли стандарт некоторые UDL в стандартной библиотеке?
Если да, то каковы они?

Ответ 1

Язык уже использует обычные суффиксы литералов, например 1U.

Это стало бы двусмысленным, если бы вы использовали U как определяемый пользователем литерал, поэтому рекомендацию.

integer-suffix: U, U, l, l, ll, ll

плавающий суффикс: f, f, l, l

Ответ 2

Стандартная библиотека фактически определяет не пользовательские литералы. Вероятно, мы ожидали бы комплексных чисел, но нет.

С другой стороны, есть предложение снова удалить их

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3250.html

поэтому мы еще не знаем, что произойдет.

Ответ 3

В отличие от ответа @Matthieu, FIDS говорит следующее в разделе 2.14.8 [lex.ext] p1:

Если токен соответствует как определяемому пользователем, так и другому буквальному типу, он рассматривается как последний.
[ Пример: 123_km - это определяемый пользователем литерал, но 12LL - целочисленный литерал. - конец примера]

Итак, даже если вы определяете эти литералы, предопределенные принимаются и нет двусмысленности.

Ответ 4

Никакие стандартные компоненты библиотеки не поставили заявку на пользовательский литерал. @Bo упомянутый комплекс как возможность.

Другим является битрейт:

template<char... Bits>
  inline constexpr std::bitset<sizeof...(Bits)>
  operator"" bits()
  {
    return std::bitset<sizeof...(Bits)>((char []){Bits..., '\0'});
  }

Я предсказываю, что будут предложения для литеральных операторов для различных компонентов библиотеки в будущих усовершенствованиях TR2 библиотеки.

Я ожидаю некоторые столкновения над пространством имен суффиксов. Вы можете объявлять литературные операторы в пространстве имен и предотвращать множественные неоднозначные определения, но вы не можете отличить фактические суффиксы пространства имен в фактическом литерале. Посмотрим.