Beachten Sie Folgendes:Argument abhängige Lookup für Freund funktioniert
namespace N {
struct A { };
struct B {
B() { }
B(A const&) { }
friend void f(B const&) { }
};
}
int main() {
f(N::B{}); // ok
f(N::A{}); // error
}
Im ersten Fall, der Fall gelingt - wir betrachten den zugehörigen Namensraum von N::B
und N::f(B const&)
finden. Groß.
Der zweite Fall schlägt fehl. Warum? Nach [namespace.memdef]:
Wenn eine
friend
Erklärung in einer nicht-lokalen Klasse zuerst eine Klasse, Funktion, Klassenvorlage oder Funktionsschablone deklariert ist der Freund ein Mitglied der innersten einschließenden Namespace. [...] Wenn eine Freundes- oder Funktionsvorlage aufgerufen wird, kann ihr Name durch die Namenssuche gefunden werden, die Funktionen aus Namespaces und Klassen berücksichtigt, die den Typen der Funktionsargumente zugeordnet sind (3.4.2).
Der zugehörige Namensraum von N::A
ist N
, von denen f
Mitglied ist, also warum wird sie nicht durch Nachschlagen gefunden?