Bạn làm sao chép khởi, và các chức năng ứng cử viên được coi là để làm các chuyển đổi trong trình tự chuyển đổi là chức năng chuyển đổi và nhà thầu chuyển đổi. Đây là trong trường hợp của bạn
B(const A&)
operator B()
Bây giờ, đó là cách bạn khai báo chúng. Quá tải phân giải tóm tắt ra khỏi đó, và biến đổi mỗi ứng cử viên vào một danh sách các tham số tương ứng với các đối số của cuộc gọi. Các thông số là
B(const A&)
B(A&)
Điều thứ hai là do hàm chuyển đổi là hàm thành viên. Các A&
là cái gọi là tham số đối tượng tiềm ẩn được tạo ra khi một ứng viên là một hàm thành viên. Bây giờ, đối số có loại A
. Khi ràng buộc tham số đối tượng ẩn, tham chiếu không const có thể liên kết với một giá trị. Vì vậy, một quy tắc khác nói rằng khi bạn có hai hàm khả thi có tham số là tham chiếu, thì ứng cử viên có chứng chỉ const ít nhất sẽ giành chiến thắng. Đó là lý do tại sao chức năng chuyển đổi của bạn thắng. Hãy thử làm cho operator B
một hàm thành viên const. Bạn sẽ nhận thấy một sự mơ hồ.
Từ quan điểm triết học hướng đối tượng, đây có phải là cách mã nên hoạt động không? Ai biết nhiều hơn về một đối tượng A nên trở thành đối tượng B, A hoặc B như thế nào? Theo C++, câu trả lời là A - có điều gì trong thực hành hướng đối tượng cho thấy điều này có đúng không? Đối với cá nhân tôi, nó sẽ có ý nghĩa một trong hai cách, vì vậy tôi quan tâm để biết làm thế nào sự lựa chọn đã được thực hiện.
Để ghi lại, nếu bạn thực hiện chức năng chuyển đổi thành một hàm thành viên, thì GCC sẽ chọn hàm tạo (vì vậy GCC có vẻ nghĩ rằng B
có nhiều doanh nghiệp hơn?). Chuyển sang chế độ pedantic (-pedantic
) để làm cho nó gây ra một chẩn đoán.
Standardese, 8.5/14
Nếu không (ví dụ, đối với các trường hợp sao chép khởi còn lại), trình tự chuyển đổi người dùng định nghĩa có thể chuyển đổi từ các loại nguồn để loại đích hoặc (khi chuyển đổi chức năng được sử dụng) cho một lớp dẫn xuất của chúng được liệt kê như mô tả trong 13.3.1.4, và tốt nhất được chọn thông qua độ phân giải quá tải (13.3).
Và 13.3.1.4
độ phân giải quá tải được sử dụng để chọn chuyển đổi người dùng định nghĩa được gọi. Giả sử rằng "CV1 T" là kiểu của đối tượng được khởi tạo, với T một kiểu lớp, các chức năng ứng cử viên được lựa chọn như sau:
- Các nhà xây dựng chuyển đổi (12.3.1) của T là chức năng ứng cử viên.
- Khi loại biểu thức khởi tạo là loại lớp "cv S", các hàm chuyển đổi của S và các lớp cơ sở của nó được xem xét. Những người không được ẩn trong S và mang lại một loại có phiên bản cv-unqualified cùng loại với T hoặc là một lớp dẫn xuất của chúng là các hàm ứng cử viên. Các hàm chuyển đổi trả về "tham chiếu đến X" trả về các giá trị của loại X và do đó được coi là mang lại X cho quá trình chọn các hàm ứng cử viên này.
Trong cả hai trường hợp, danh sách đối số có một đối số, là biểu thức khởi tạo. [Lưu ý: đối số này sẽ được so sánh với tham số đầu tiên của các hàm tạo và chống lại tham số đối tượng ẩn của các hàm chuyển đổi. ]
Và 13.3.3.2/3
- Chuẩn chuỗi chuyển đổi S1 là một chuỗi chuyển đổi tốt hơn so với trình tự chuyển đổi tiêu chuẩn S2 nếu [...] S1 và S2 là các ràng buộc tham chiếu (8.5.3), và các loại tham chiếu tham chiếu là cùng loại ngoại trừ các loại vòng loại cv cấp cao nhất và loại mà tham chiếu được khởi tạo bằng tham chiếu S2 là cv đủ điều kiện hơn loại tham chiếu được khởi tạo bởi S1 đề cập.
Dòng mà bạn nhận xét "// constructor" không phải là một nhà xây dựng bản sao. –
Bạn nói đúng, tôi đã lạm dụng thuật ngữ này. Tôi đã chỉnh sửa nó. – GRB