Tôi chỉ mất một số lượng thời gian không đủ thời gian với một lỗi biên dịch trong Visual Studio. Tôi đã chưng cất mã vào ví dụ nhỏ có thể biên dịch bên dưới và thử nó trên IdeOne và gặp lỗi tương tự mà bạn có thể thấy here.Tại sao mã này đang cố gắng gọi hàm tạo bản sao?
tôi tự hỏi tại sao đoạn code sau cố gắng gọi B(const B&)
thay vì B(B&&)
:
#include <iostream>
using namespace std;
class A {
public:
A() : data(53) { }
A(A&& dying) : data(dying.data) { dying.data = 0; }
int data;
private:
// not implemented, this is a noncopyable class
A(const A&);
A& operator=(const A&);
};
class B : public A { };
int main() {
B binst;
char* buf = new char[sizeof(B)];
B* bptr = new (buf) B(std::move(binst));
cout << bptr->data << endl;
delete[] buf;
}
Tôi không xác định một cách rõ ràng bất kỳ nhà xây dựng, vì vậy B(std::move(binst))
nên gọi trình biên dịch tạo ra B(B&&)
, không có?
Khi tôi thay đổi B
để
class B : public A {
public:
B() { }
B(B&&) { }
};
Nó biên dịch tốt. Tại sao điều này? Nó sẽ vô cùng bất tiện nếu điều này không thể được sửa từ lớp cơ sở vì tôi có một lớp mẫu sử dụng vị trí mới và di chuyển các hàm tạo như ví dụ, và nó sẽ yêu cầu mọi lớp không thể sao chép được (không và chắc chắn không phải là một yêu cầu để sử dụng với lớp mẫu của tôi) để có một hàm tạo di chuyển được định nghĩa rõ ràng.
Có trình biên dịch được tạo B (B &&) không? C++ 11 của tôi vẫn còn một chút gỉ. Và B của bạn (B &&) có cần khởi tạo A (A &&) không? – CashCow
@CashCow có, tất cả những gì bạn làm là di chuyển từng thành viên (nếu điều đó sai thì tôi đang nhìn bạn, Kerrek SB ':)') –
Biên dịch tốt trên GCC 4.6, GCC 4.7 và Clang 3.0. –