Подтвердить что ты не робот

Почему по умолчанию не заданы стандартные литералы С++ 14 в глобальном пространстве имен?

С++ 14 включает стандартизированные литералы, среди прочего, std::string и различные временные интервалы из заголовка <chrono>.

Чтобы использовать их, вы должны сказать using namespace std::literals; (или некоторые варианты в зависимости от того, какие именно литералы вы хотите, поскольку они находятся во множестве встроенных пространств имен).

Все это хорошо, но мне любопытно, почему требуется объявление using. UDL без лидирующего подчеркивания зарезервированы для реализации, поэтому нет возможности, чтобы "hello world"s мог когда-либо означать что-либо еще в стандартной программе.

Итак, почему нет #include <string>, достаточного для того, чтобы привести литеральную функцию преобразования в область видимости? Почему я должен явно включать литеральное пространство имен?

EDIT: N3531 - это самая последняя версия предложения, которую я могу найти - к сожалению, она не обсуждает мотивацию для размещения вещей в пространстве имен, но только говорит:

Можно суммировать требования обсуждения [Портленд] следующим образом:

  • используйте встроенное пространство имен для (группы связанных) операторов UDL
4b9b3361

Ответ 1

Уже существует два UDL с именем s: один для строк и один для seconds. Из-за понятных кратковременных имен суффиксов они хронически страдают от конфликтов имен, поэтому выливание всех их в одно пространство имен не может продолжаться долго. Следовательно, было решено, что они будут помещены в встроенные пространства имен, которые допускают как однозначные (using namespace std::literals::chrono_literals), так и простые директивы using (using namespace std).

Ответ 2

стандартная библиотека уже определяет несколько версий того, что s может означать:

  • Его можно использовать для определения строкового литерала.
  • Его можно использовать для определения литерала chrono::seconds.

Один основан на строковом литерале, один основан на целых числах или буквах double, конечно, то есть они могут фактически сосуществовать. Однако я ожидаю, что в будущем может быть больше использования s. Таким образом, необходимость выбирать, какие пространства имен импортируются, а не получать наложенные на вас, кажется разумным.

Ответ 3

Посмотрите на бумагу N2765. UDL подключаются к обычным процессам поиска имен. Поскольку строковые литералы имеют общие типы строк, существует большая вероятность столкновения, если вы проигнорировали пространства имен.