Có hai điều đáng ngờ bạn có trong trình tạo bản sao của mình.
Trước tiên, bạn đã thực hiện các bản sao-constructor rõ ràng (mà là một điều đáng ngờ để làm), vì vậy bạn sẽ (về mặt lý thuyết) cần thực hiện:
Foo d((Foo()));
Thứ hai, xây dựng bản sao của bạn mất một tham chiếu chứ không phải tham chiếu const
có nghĩa là bạn không thể sử dụng nó với một tạm thời Foo
.
Cá nhân, tôi chỉ cần xóa explicit
từ trình tạo bản sao và làm cho tham chiếu const
nếu có thể.
Lưu ý rằng explicit
trên hàm tạo mặc định của bạn không có hiệu lực. [*] explicit
chỉ có tác dụng đối với các nhà thầu có thể được gọi với một tham số duy nhất. Nó ngăn cản chúng được sử dụng cho các chuyển đổi tiềm ẩn. Đối với các hàm tạo chỉ lấy 0 hoặc chỉ có hai hoặc nhiều tham số, nó không có hiệu lực.
[Lưu ý: có thể có một sự khác biệt giữa:.
Foo d;
và
Foo d = Foo();
nhưng trong trường hợp này, bạn có một constructor mặc định sử dụng tuyên bố như thế này không áp dụng]
Chỉnh sửa: [*] Tôi vừa kiểm tra lại điều này và 12.3.1 [class.conv.ctor] nói rằng bạn có thể tạo điều khoản mặc định tructor explicit
. Trong trường hợp này, hàm tạo sẽ được sử dụng để thực hiện khởi tạo mặc định hoặc khởi tạo giá trị.Thành thật mà nói, tôi không hiểu giá trị của điều này như thể bạn có một constructor do người dùng khai báo thì đó là kiểu không phải POD và thậm chí cả các đối tượng cục bộ kiểu không POD được khởi tạo mặc định nếu chúng không có initializer điều khoản này nói có thể được thực hiện bởi một hàm dựng mặc định là explicit
. Có lẽ ai đó có thể chỉ ra một trường hợp góc mà nó làm cho một sự khác biệt nhưng bây giờ tôi không thấy những gì có hiệu lực explicit
có trên một constructor mặc định.
Nguồn
2010-05-05 19:55:19
Foo Foo Foo? Huh? –
Trình biên dịch đã trả lời câu hỏi của bạn ... 'Foo (const Foo &)'. 'Foo d = Foo();' đang gọi hàm tạo bản sao. –
+1 bởi vì không ai có thể biết câu trả lời –