It recently came to my attention chức năng thành viên hoàn toàn bóng các chức năng miễn phí có cùng tên khi ở trong lớp học. Và hoàn toàn tôi có nghĩa là mọi chức năng tự do có cùng tên không được xem xét cho độ phân giải quá tải. Tôi có thể hiểu lý do tại sao nó được thực hiện với somwthing như thế này:Tại sao các hàm thành viên của lớp đổ bóng các hàm miễn phí có cùng tên?
void f();
struct S
{
void f();
void g()
{
f(); // calls S::f instead of ::f
}
};
nơi các hàm có chữ ký giống hệt nhau, nó chỉ tự nhiên như phạm vi biến hoạt động theo cùng một cách. Nhưng tại sao cấm các cuộc gọi unambigious nơi chức năng miễn phí có chữ ký khác nhau như thế này:
void f();
struct S
{
void f(int x);
void g()
{
f(); // fails to compile attempting to call S::f, which has wrong signature
}
};
Tôi không yêu cầu làm thế nào để gọi một shadowed chức năng miễn phí từ bên trong lớp. Những gì tôi muốn biết là lý do đằng sau thiết kế này.
Bạn có thể cần phải hỏi Bjarne Stroustrup! – peacemaker
Tìm kiếm như thế có nghĩa là danh sách các hàm ứng cử viên được tạo ra luôn nhỏ. Đó là tốt cho thời gian biên dịch, bạn có thể tưởng tượng nếu nó tìm kiếm tất cả các ứng cử viên có thể (bao gồm cả ADL) và có rất nhiều mẫu nó sẽ rất nhanh chóng nhận được rất chậm. Nó cũng phản ánh cách sử dụng và ngữ nghĩa mong muốn trong hầu hết các trường hợp. Bình thường khi bạn nói 'foo' cái 'foo' bạn đang nghĩ đến là cái gần nhất. Nếu nó không phải là gần nhất nó có thể chỉ cần thực hiện một sai lầm. Một lỗi là tốt hơn so với những thứ kỳ lạ xảy ra tại thời gian chạy. Giữ mọi thứ cục bộ là hành vi tốt. – Flexo
bạn có thể thưởng thức bản trình bày này trên Tra cứu tên: http://channel9.msdn.com/Series/C9-Lectures-Stephan-T-Lavavej-Core-C-/Stephan-T-Lavavej-Core-C-1-of -n – MFH