Какие пользовательские литералы предопределены стандартом?
Мой вопрос звучит как противоречие, но я не знаю, как еще ссылаться на новый литерал, отличный от 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 библиотеки.
Я ожидаю некоторые столкновения над пространством имен суффиксов. Вы можете объявлять литературные операторы в пространстве имен и предотвращать множественные неоднозначные определения, но вы не можете отличить фактические суффиксы пространства имен в фактическом литерале. Посмотрим.