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

Быстрый вопрос: почему С++ 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 в часто задаваемых вопросах Stroustrup C++11 использует именно этот пример. Кроме того, UDL без начального подчеркивания зарезервированы, поэтому не будет проблем с разрешением простого s, как указано выше, - нет возможности его конфликта с чем-либо еще.

Возможно, я что-то упускаю, но кажется, что это было бы очень ценным и безопасным дополнением к языку, так кто-нибудь знает, почему C++11 не предлагает его? Вероятно ли, что он появится в C++14?


person Tristan Brindle    schedule 26.02.2014    source источник


Ответы (1)


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

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

person Jerry Coffin    schedule 26.02.2014
comment
Ну вот, идеальный ответ за считанные секунды +1 (или больше, если бы я мог). Странно, что это не было частью первоначального предложения UDL, но поехали. Я с нетерпением жду, когда наконец (надеюсь) избавлюсь от проклятия char* в C++14! - person Tristan Brindle; 26.02.2014
comment
Я хотел бы использовать это, особенно в сочетании с auto - person Excelcius; 26.02.2014
comment
@Excelcius: важнее, чем с auto (по крайней мере, IMO), просто в выражениях, таких как сложение строк вместе: например, "A"s + "B"s. - person Jerry Coffin; 26.02.2014
comment
@JerryCoffin: мне кажется, вы добавляете As и B: p - person Matthieu M.; 26.02.2014
comment
@MatthieuM.: и поэтому я (или, по крайней мере, A и B). - person Jerry Coffin; 26.02.2014