Недавно меня укусил ADL (поиск, зависящий от аргумента) аналогично этой ссылке. Похоже, что все согласны с тем, что перегрузку операторов всегда следует выполнять в одном из пространств имен аргументов, чтобы избежать подобных проблем.
Однако для типов STL это невозможно, поскольку запись кода в пространстве имен std является UB.
Что бы вы сделали, если бы захотели определить, например, оператор потока для std::list<int>?
Я бы не стал определять такой оператор именно по этой причине. Форматирование потока в любом случае уже на подходе. Приветствуем ваших новых повелителей std::format.
Во-первых, я бы не стал реализовывать оператор, который имеет только std:: параметры. Это не только ADL, но у него есть и другие проблемы.
Я бы написал void print(const std::list<int>&) или просто написал цикл
Мой совет: не пишите операторы для типов, которыми вы не владеете. вместо этого напишите именованные функции.
Или оберните его в тип, который у вас есть. Нет проблем с перегрузкой << для struct my_list_wrapper { const std::list<int>& ref; };





Я бы написал именованную функцию
void print(const std::list<int>&);
Или перегрузите operator<< для типа в моем собственном пространстве имен:
namespace my {
struct list_wrapper {
const std::list<int>& ref;
};
std::ostream& operator<<(std::ostream&,const list_wrapper&);
}
Функция не нуждается в ADL, и << для пользовательского типа вполне подходит для ADL.
Обычно я советую не перегружать операторы для типов, которыми вы не владеете. Все, что вы можете сделать с типами из std::, можно сделать и в любой другой библиотеке. Это потенциал для конфликтов и проблем.
пожалуйста, сделайте вопрос самостоятельным, используйте ссылки для получения дополнительной информации. Что такое «аналогично этой ссылке»?