xem xét lớp này đơn giảnrvalues với bản sao khai thác
class Foo
{
public:
Foo() = default;
Foo(const Foo &) = default;
Foo & operator=(const Foo & rhs)
{
return *this;
}
Foo & operator=(Foo && rhs) = delete;
};
Foo getFoo()
{
Foo f;
return f;
}
int main()
{
Foo f;
Foo & rf = f;
rf = getFoo(); // Use of deleted move assignment.
return 0;
}
Khi tôi biên dịch ví dụ trên tôi nhận được error: use of deleted function 'Foo& Foo::operator=(Foo&&)'
Từ Copy Assignment:
Nếu chỉ việc giao bản sao được cung cấp, tất cả các loại đối số chọn nó (miễn là nó lấy đối số của nó theo giá trị hoặc tham chiếu đến const, vì rvalues có thể liên kết với tham chiếu const), làm cho việc gán bản sao dự phòng cho m ove chuyển nhượng, khi di chuyển không có sẵn.
Tại sao trình biên dịch dự phòng không được sao chép khi tham chiếu const lvalue có thể liên kết với rvalue và const Foo & f = getFoo();
hoạt động.
Trình biên dịch - gcc 4.7.2.
Bạn không có nghĩa là "hàm tạo di chuyển là * có sẵn *"? – Quentin
@Quentin Bạn nói đúng, cảm ơn bạn! Đã chỉnh sửa. – sergej