Ответ 1
На самом деле существуют две причины, по которым литералы помещаются в пространства имен:
- Считается нежелательным, чтобы пользователи использовали
using namespace std;
только для того, чтобы получить соответствующие литералы. Наличие литералов, объявленных в пространствах имен, специфичных для них, не вызывает проблемы. - В зависимости от домена может быть желательно использовать
s
как суффикс для чего-то другого. Существует еще один суффиксs
для обозначения секунд, но они действительно не конфликтуют.
В видеоролике видеороликов STL CppCon 2014 (опубликовано remyable в комментарии) Стефан Т. Лававей объясняет общий дизайн литералов в С++ 14 и довольно ясно, что они не должны находиться в глобальном пространстве имен! Вместо этого буквенные суффиксы в стандартной библиотеке живут в иерархии пространств имен inline
, предоставляя пользователям мелкомасштабный контроль над доступными литералами. Например, буквальный суффикс для строк объявляется следующим образом (21.3 [string.classes], пункт 1):
namespace std {
inline namespace literals {
inline namespace string_literals {
string operator"" s(char const* str, size_t len);
}
}
}
Эта иерархия пространств имен inline
позволяет пользователям получить соответствующий выбор буквенных суффиксов:
-
using namespace std;
- вы получаете все в стандартной библиотеке С++, включая буквенные суффиксы, без какой-либо квалификации. -
using namespace std::literals;
- вы получаете все литеральные суффиксы, определенные в стандартной библиотеке С++. -
using namespace std::string_literals;
- вы получаете все литеральные суффиксы, применимые к строкам. -
using namespace std::literals::string_literals;
- да, вы можете это сделать, но вы действительно не должны: это эквивалентноusing namespace std::string_literals;
.
Ясно, что комитет не пошел бы на такие большие усилия, если бы он счел эту идею жизнеспособной, чтобы просто загрязнять глобальное пространство имен буквальными суффиксами, хотя они даже не могут конфликтовать с любыми сущностями буквального словаря.