xem xét như sau:Đối số tra cứu phụ thuộc cho bạn chức năng
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
}
Trong trường hợp đầu tiên, trường hợp thành công - chúng tôi xem xét các không gian tên có liên quan của N::B
và tìm N::f(B const&)
. Tuyệt quá.
Trường hợp thứ hai không thành công. Tại sao? Theo [namespace.memdef]:
Nếu một tuyên bố
friend
trong một lớp học không địa phương đầu tiên khai báo một lớp, chức năng, lớp mẫu hay hàm mẫu người bạn là một thành viên của không gian tên kèm theo trong cùng. [...] Nếu một hàm của bạn bè hoặc mẫu hàm được gọi, tên của nó có thể được tìm thấy bằng tra cứu tên xem xét các hàm từ các không gian tên và các lớp liên kết với các kiểu đối số hàm (3.4.2).
Các namespace liên quan của N::A
là N
, trong đó f
là thành viên, vì vậy tại sao nó không tìm thấy bằng cách tra cứu?