В каком пространстве имен используется оператор << (поток)?

Если у меня есть некоторые перегруженные операторы ostream, определенные для локальных объектов библиотеки, нормально ли им перейти в пространство имен std? Если я не объявляю их в пространстве имен std, тогда я должен использовать using ns:: operator <<.

В качестве возможного последующего вопроса существуют ли какие-либо операторы, которые должны перейти в стандартное или глобальное пространство имен?

Ответы

Ответ 1

В соответствии с Koenig Lookup (С++ Standard 3.4.2) operator<< будет выполняться поиск в пространствах имен аргументов. Не нужно объявлять его в пространстве имен std.

Ответ 2

operator<<( ..., MyClass ) должен находиться в том же пространстве имен, что и MyClass. Вы должны думать об этом как о части интерфейса MyClass, даже если это (обязательно) функция, не являющаяся членом.

Несколько ссылок:

Ответ 3

Стандарт С++ явно запрещает вам объявлять свои собственные конструкции в пространстве имен std.

Ответ 4

Как правило, плохая практика - объявлять что-либо (типы, операторы и т.д.) как часть пространства имен, которое у вас нет. Это может иметь неожиданные последствия для людей, потребляющих вашу библиотеку. Лучшее решение - определить ваше собственное пространство имен и импортировать как std, так и ваше пространство имен, когда вам нужно объединить решения.