Я думаю, что этот пример лучше всего иллюстрирует мой вопрос:
namespace N {
class C {
public:
friend bool operator==(const C& c, const C& x) {
return true;
}
friend bool f(const C& c, const C& x) {
return true;
}
};
class D {
public:
bool operator==(const D& x) {
bool a = C{} == C{}; // this works
return true;
}
bool f(const D& x) {
bool a = f(C{}, C{}); // this does not work
return true;
}
};
}
Я всегда рассматривал перегруженные операторы как функции, за исключением «синтаксиса вызова», если хотите. Я только что заметил вышеуказанную разницу в правилах ADL или поиска имени (я не знаю, в каких).
Может кто-нибудь объяснить, почему bool operator==(const C& c, const C& x)
найдено, а bool f(const C& c, const C& x)
нет?