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

Почему оператор "скрыт" в пространстве имен?

Чтобы использовать operator""s для std::string, вам нужно сделать using namespace std::string_literals. Но пользовательские литералы, которые не начинаются с _, зарезервированы, поэтому возможный конфликт не может служить оправданием. Другой operator""s имеет значение std::chrono, но для int литералов, поэтому там нет конфликта.

В чем причина этого?

4b9b3361

Ответ 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;.

Ясно, что комитет не пошел бы на такие большие усилия, если бы он счел эту идею жизнеспособной, чтобы просто загрязнять глобальное пространство имен буквальными суффиксами, хотя они даже не могут конфликтовать с любыми сущностями буквального словаря.