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