James McNellis ’ câu trả lời thực sự đã đề cập đến tất cả, nhưng nó không ’ tổn thương (Tôi hy vọng) với nhiều giải thích hơn.
So.
Khi bạn gọi & hellip;
o.operator int()
& hellip; sau đó việc lựa chọn quá tải phụ thuộc hoàn toàn vào độ chói của o
.
Không có gì khác.
Để xem lý do tại sao, hãy xem xét lớp này:
struct Bar
{
void f() {}
void f() const {}
};
Về mặt kỹ thuật những hàm thành viên không cần phải có hàm thành viên. Họ cũng có thể được chọn là chức năng đứng tự do. Nhưng sau đó họ cần Bar
luận:
struct Bar
{};
void f(Bar&) {}
void f(Bar const&) {}
Và hy vọng bây giờ nó dễ dàng hơn để thấy rằng khi bạn làm
Bar o;
f(o);
thì hàm đầu tiên thể được lựa chọn. Và do đó, nó là. Bởi vì nếu chức năng thứ hai được chọn, thì bạn sẽ không bao giờ có được chức năng thứ nhất. Bởi vì nếu bạn tạo đối tượng const
, thì nó sẽ phá vỡ độ chính xác const
để chọn đối tượng đầu tiên. Vì vậy, khi đối tượng là const
chỉ có thể chọn thứ hai, do đó, khi nó không phải là const
, cái đầu tiên được chọn.
Tóm lại, cách thay thế thực tế duy nhất cho quy tắc này sẽ là luôn luôn chọn giải pháp thứ hai, điều này sẽ khiến người đầu tiên thay thế vô dụng, phải không?
Cheers & h.,
Nguồn
2011-06-29 03:59:19
Thậm chí 'A' là một chồng/đống phân bổ đối tượng bình thường (không phải tạm thời), nó mang lại cho kết quả tương tự. – iammilind
Nếu đối tượng không đủ điều kiện, sự quá tải không const sẽ phù hợp hơn trong quá trình phân giải quá tải. Có lý do nào bạn mong đợi điều này không đúng không? –
Tại sao tôi bị lẫn lộn là, ngay cả khi 'foo()' nhận 'const int' và chúng ta có toán tử' A :: const int() const; ', nó vẫn đi và chọn toán tử' A :: int' bình thường . – iammilind