Почему нет стандартного суффикса буква для std::string?
Быстрый вопрос: почему С++ 11 не предлагает "user-" (действительно, стандартную библиотеку) определенный литерал для создания std::string
, например
auto str = "hello world"s; // str is a std::string
Подобно С++, Objective-C поддерживает как строки C-стиля, так и более удобный для пользователя тип библиотеки NSString
; однако, в отличие от С++, никто никогда не путается между ними, потому что тривиально создавать NSString
путем префикса строкового литерала с помощью @
. На самом деле редко встречается код Objective-C, где литерал не имеет префикса @
. Все знают, что способ сделать это, использует NSString
и продолжает с ним.
С++ 11 пользовательских литералов разрешили бы это, и на самом деле раздел UDL в FAQ Stroustrup С++ 11 использует именно этот пример. Кроме того, UDL без предварительного подчеркивания зарезервированы, поэтому не было бы проблем в разрешении простого s
, как указано выше, - нет никакой возможности его столкновения с чем-либо еще.
Возможно, мне что-то не хватает, но похоже, что это было бы очень ценным и безрисковым дополнением к языку, так кто-нибудь знает, почему С++ 11 не предлагает его? Возможно, он появится в С++ 14?
Ответы
Ответ 1
Пользовательские литералы были достаточно новыми в С++ 11, что это не было включено, но оно находится в С++ 14 (в §21.7, в случае, если кто-то заботится). И да, он использует s
как суффикс. Точный тип результата зависит от типа самого строкового литерала - "узкий" литерал дает std::string
, литерал u16 дает u16string
, а литерал u32 дает u32string
. О, и да, если вы настаиваете на использовании широкого строкового литерала, он произведет wstring
.
Обратите внимание, что суффикс s
также используется для обозначения секунд (определяется в <chrono>
), но нет реального конфликта между двумя - s
в строковом литерале означает строку и s
на число означает секунды.