Je pense que cet exemple illustre le mieux ma question:Existe-t-il des règles différentes concernant les conflits ADL ou de dénomination en ce qui concerne les opérateurs surchargés?
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;
}
};
}
Je l'ai toujours vu comme étant surchargées opérateurs comme fonction, sauf pour la « syntaxe d'appel » si vous voulez. J'ai juste noté la différence ci-dessus cependant dans ADL ou les règles de recherche de nom (je ne sais pas lequel).
Quelqu'un peut-il expliquer pourquoi le bool operator==(const C& c, const C& x)
est trouvé mais pas le bool f(const C& c, const C& x)
?
Notez que ce cache, pas ADL, puisque tout est dans le même espace. ADL consiste à rechercher la fonction dans des espaces de noms supplémentaires * (en particulier, les espaces de noms dans lesquels les types de paramètres sont définis). –