Câu hỏi gần đây khiến tôi băn khoăn về các nhà xây dựng bản sao rõ ràng. Dưới đây là một số mẫu mã mà tôi đã cố gắng biên soạn theo Visual Studio 2005:Hành vi tạo bản sao rõ ràng và sử dụng thực tế
struct A
{
A() {}
explicit A(const A &) {}
};
// #1 > Compilation error (expected behavior)
A retByValue()
{
return A();
}
// #2 > Compiles just fine, but why ?
void passByValue(A a)
{
}
int main()
{
A a;
A b(a); // #3 > explicit copy construction : OK (expected behavior)
A c = a; // #4 > implicit copy construction : KO (expected behavior)
// Added after multiple comments : not an error according to VS 2005.
passByValue(a);
return 0;
}
Bây giờ cho các câu hỏi sau:
- là # 2 cho phép theo tiêu chuẩn? Nếu có, phần liên quan mô tả tình huống này là gì?
- Bạn có biết bất kỳ cách sử dụng thực tế nào cho một nhà xây dựng bản sao rõ ràng không?
[EDIT] tôi chỉ tìm thấy một liên kết hài hước trên MSDN với tình hình chính xác giống nhau, và một bình luận bí ẩn từ các chức năng chính: "c được sao chép" (như thể nó là rõ ràng). Theo chỉ dẫn của Oli Charlesworth: gcc không biên dịch mã này và tôi tin rằng anh ta không đúng.
Tôi không nghĩ rằng các nhà xây dựng bản sao rõ ràng là một ý tưởng hay. Bạn đã đọc về chúng ở đâu? – fredoverflow
Điều này dường như được sửa trong VC++ 2010 - nó đưa ra một lỗi cho dòng 'passByValue (a); '. – user200783