lớp học
{
public:
rõ ràng Foo() {}
rõ ràng Foo(Foo&) {}
};
Foo d = Foo();
lỗi: không có chức năng khớp cho lệnh gọi tới 'Foo::Foo(Foo)'
Tôi đã thử làm theo thông báo lỗi để thay đổi Foo(Foo&)
Thay đổi thành Foo(Foo)
, mà AFAIK không phải là hàm tạo hợp lệ và tôi chắc chắn nhận được:
lỗi: hàm tạo không hợp lệ; có thể ý bạn là 'Foo (const Foo&)'
Cái gì đã cho? Làm thế nào tôi có thể giải quyết vấn đề này? (BTW, đây là trên GCC)
Có hai điều khó hiểu trong hàm tạo bản sao của bạn.
Trước tiên, bạn đã làm cho hàm tạo bản sao trở nên rõ ràng (đây là một vấn đề), vì vậy (về mặt lý thuyết) bạn cần phải làm điều này:
Foo d( (Foo()) );
Thứ hai, hàm tạo bản sao của bạn lấy một tham chiếu thay vì const
tài liệu tham khảo, có nghĩa là bạn không thể sử dụng nó tạm thời Foo
được sử dụng cùng nhau.
Cá nhân tôi chỉ xóa khỏi hàm tạo bản sao rõ ràng
và sử dụng bất cứ khi nào có thể const
引用。
Lưu ý rằng trên hàm tạo mặc định rõ ràng
không hợp lệ. [*] rõ ràng
Chỉ ảnh hưởng đến các hàm tạo có thể được gọi bằng một đối số duy nhất. Nó ngăn không cho chúng được sử dụng cho các chuyển đổi ngầm. Nó không có tác dụng đối với các hàm tạo chỉ chấp nhận 0 hoặc hai hoặc nhiều đối số.
[Lưu ý: Có thể có sự khác biệt giữa hai điều này:
Đồ ăn;
Và
Foo d = Foo();
Nhưng trong trường hợp này, bạn có hàm tạo mặc định do người dùng khai báo, vì vậy điều này không áp dụng. ]
biên tập:[*] Tôi vừa kiểm tra lại cái này và 12.3.1 [class.conv.ctor] nói rằng bạn có thể tạo một hàm tạo mặc định rõ ràng
. Trong trường hợp này, hàm tạo sẽ được sử dụng để thực thiKhởi tạo mặc định hoặcKhởi tạo giá trị. Thành thật mà nói, tôi không hiểu giá trị của nó, giống như nếu bạn có một hàm tạo do người dùng khai báo thì đó là loại không phải POD, ngay cả các đối tượng cục bộ thuộc loại không phải POD sẽ được khởi tạo theo mặc định nếu không có trình khởi tạo trong mệnh đề này chỉ ra rằng nó có thể vượt qua rõ ràng
Hàm tạo mặc định hoàn tất. Có lẽ ai đó có thể chỉ ra một trường hợp đặc biệt trong đó nó tạo ra sự khác biệt, nhưng hiện tại tôi chưa thấy điều đó rõ ràng
Nó có tác dụng gì đối với hàm tạo mặc định.
Tôi là một lập trình viên xuất sắc, rất giỏi!