Почему по умолчанию не заданы стандартные литералы С++ 14 в глобальном пространстве имен?
С++ 14 включает стандартизированные литералы, среди прочего, std::string
и различные временные интервалы из заголовка <chrono>
.
Чтобы использовать их, вы должны сказать using namespace std::literals;
(или некоторые варианты в зависимости от того, какие именно литералы вы хотите, поскольку они находятся во множестве встроенных пространств имен).
Все это хорошо, но мне любопытно, почему требуется объявление using
. UDL без лидирующего подчеркивания зарезервированы для реализации, поэтому нет возможности, чтобы "hello world"s
мог когда-либо означать что-либо еще в стандартной программе.
Итак, почему нет #include <string>
, достаточного для того, чтобы привести литеральную функцию преобразования в область видимости? Почему я должен явно включать литеральное пространство имен?
EDIT: N3531 - это самая последняя версия предложения, которую я могу найти - к сожалению, она не обсуждает мотивацию для размещения вещей в пространстве имен, но только говорит:
Можно суммировать требования обсуждения [Портленд] следующим образом:
- используйте встроенное пространство имен для (группы связанных) операторов UDL
Ответы
Ответ 1
Уже существует два UDL с именем s
: один для строк и один для seconds. Из-за понятных кратковременных имен суффиксов они хронически страдают от конфликтов имен, поэтому выливание всех их в одно пространство имен не может продолжаться долго. Следовательно, было решено, что они будут помещены в встроенные пространства имен, которые допускают как однозначные (using namespace std::literals::chrono_literals
), так и простые директивы using
(using namespace std
).
Ответ 2
стандартная библиотека уже определяет несколько версий того, что s
может означать:
- Его можно использовать для определения строкового литерала.
- Его можно использовать для определения литерала
chrono::seconds
.
Один основан на строковом литерале, один основан на целых числах или буквах double
, конечно, то есть они могут фактически сосуществовать. Однако я ожидаю, что в будущем может быть больше использования s
. Таким образом, необходимость выбирать, какие пространства имен импортируются, а не получать наложенные на вас, кажется разумным.
Ответ 3
Посмотрите на бумагу N2765. UDL подключаются к обычным процессам поиска имен. Поскольку строковые литералы имеют общие типы строк, существует большая вероятность столкновения, если вы проигнорировали пространства имен.