2013-08-23 34 views
5

Kể từ khi tôi có nghi ngờ về câu hỏi này (đối với C++ 03) Tôi gửi bài nó here.I chỉ đọc về constructor chuyển đổi và nó khẳng định rằngConfused giữa một constructor sao chép và một constructor chuyển đổi

"Để là một hàm tạo chuyển đổi, hàm tạo phải có một đối số duy nhất và được khai báo mà không có từ khoá rõ ràng. "

Bây giờ câu hỏi của tôi là liệu trình tạo bản sao có thể được gọi là hàm tạo chuyển đổi miễn là nó không được khai báo rõ ràng không? Liệu nó có đủ điều kiện để trở thành một? Tôi tin rằng nó không thể được gọi là một nhà xây dựng chuyển đổi bởi vì nó chỉ chấp nhận cùng một tham số kiểu mà kết quả là không có chuyển đổi. Đối với Instance

foo a; 
foo b; 
a = 100; //a Conversion constructor would be called (i.e) foo(int a){...} 
a = b ; //Since both objects are same type and have been initialized the assignment operator will be called (if there is an overloaded version otherwise the default will be called) 

Hiểu biết của tôi có đúng không?

+0

'operator =()' sẽ được ưu tiên nếu có thể, nhưng câu hỏi thực sự là "điều gì sẽ xảy ra khi không thể tìm thấy thực thi' operator =() 'phù hợp?" – cdhowie

+0

foo a = 100; // là công trình chuyển đổi foo b = a; // là bản sao xây dựng –

+0

[class.conv.ctor]/3 "Một trình tạo bản sao không rõ ràng (12.8) là một hàm tạo chuyển đổi. Một hàm tạo bản sao được khai báo ngầm không phải là một hàm tạo rõ ràng; nhập chuyển đổi. " – dyp

Trả lời

0

Có, một nhà xây dựng bản sao là những gì nó là - một nhà xây dựng bản sao. Mà không phải là một hàm tạo chuyển đổi mà chuyển đổi từ một loại này sang một loại khác.

+0

Nếu đây là một bình luận? Và bạn có thể sửa ngữ pháp không? –

+0

Ngoại trừ việc nó là gì * là * một hàm tạo chuyển đổi. Chuyển đổi cho cùng một loại có thể tầm thường, nhưng nó vẫn là một chuyển đổi về mặt kỹ thuật. –

+0

Ngữ pháp cố định, có rõ ràng hơn không? –

10

Trích dẫn các tiêu chuẩn:

[class.conv.ctor]/3

Một phi rõ ràng sao chép constructor (12,8) là một constructor chuyển đổi. Một hàm tạo bản sao được khai báo ngầm không phải là một hàm tạo rõ ràng; nó có thể được gọi cho chuyển đổi loại tiềm ẩn.

Vì vậy, có, bản sao ctor là một ctor chuyển đổi.

Cũng lưu ý [conv]/1 mà quy định cụ thể và chỉ ra trong một nhận xét:

Lưu ý: một chuỗi chuyển đổi tiêu chuẩn thể để trống, nghĩa là, nó có thể bao gồm không chuyển đổi.

và trong/3:

Một biểu e có thể được ngầm chuyển đổi sang một loại T nếu và chỉ nếu việc kê khai T t=e; nổi hình thành

Vì vậy, các bộ ngầm chuyển đổi chứa các chuyển đổi trống.

+0

+1 cho báo giá tham khảo tuyệt vời – sehe

Các vấn đề liên quan