Почему нет стандартного суффикса буква для std::string? - программирование
Подтвердить что ты не робот

Почему нет стандартного суффикса буква для 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?

4b9b3361

Ответ 1

Пользовательские литералы были достаточно новыми в С++ 11, что это не было включено, но оно находится в С++ 14 (в §21.7, в случае, если кто-то заботится). И да, он использует s как суффикс. Точный тип результата зависит от типа самого строкового литерала - "узкий" литерал дает std::string, литерал u16 дает u16string, а литерал u32 дает u32string. О, и да, если вы настаиваете на использовании широкого строкового литерала, он произведет wstring.

Обратите внимание, что суффикс s также используется для обозначения секунд (определяется в <chrono>), но нет реального конфликта между двумя - s в строковом литерале означает строку и s на число означает секунды.