Rozważmy następujący:Argument dla znajomego funkcjonuje
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
}
W pierwszym przypadku sprawa się powiedzie - uważamy przynależne nazw z N::B
i znaleźć N::f(B const&)
. Wspaniały.
Drugi przypadek nie powiedzie się. Czemu? Według [namespace.memdef]:
Jeżeli deklaracja w nielokalnego klasy
friend
pierwszy deklaruje klasę, funkcja, klasa szablon lub szablon funkcja przyjaciel jest członkiem najbardziej wewnętrznej otaczającej przestrzeni nazw. [...] Jeśli wywoływana jest funkcja przyjaciel lub szablon funkcji , jej nazwa może być znaleziona przez wyszukiwanie nazw, które uwzględnia funkcje z przestrzeni nazw i klas powiązanych z typami argumentów funkcji (3.4.2).
Związane z nazw jest N
N::A
, z których f
jest członkiem, więc dlaczego nie znaleźć przez wyszukiwarkę?