Vấn đề chính là bạn không cung cấp hàm tạo gán. Do đó, trình biên dịch tạo ra một mặc định một cho bạn: constructor phân
X& X::operator =(const X& x){
this.member = x.member;
return *this;
}
Giá trị mặc định chấp nhận kiểu lập luận như const X & trong đó const là một ở mức độ thấp const và chiến thắng' không được bỏ qua là cấp cao nhất const.
Mã của bạn X b = a
có nghĩa là gọi hàm tạo mặc định. Nhưng lập luận của bạn a
có kiểu dễ bay hơi X (có thể được chuyển đổi sang dễ bay hơi X & và const dễ bay hơi X &) không thể được chuyển đổi sang const X & ngầm.
Vì vậy, bạn cần xác định xây dựng nhiệm vụ của riêng bạn như
X& X::operator =(volatile const X&);
EDIT
Nó gây sốc cho tôi rằng rất nhiều chàng trai nghĩ rằng copy constructor (hoặc gọi bản sao khởi) là được gọi khi sử dụng nhà điều hành chuyển nhượng . Có thể gọi nó là nhà điều hành gán không phổ biến. Tuy nhiên, những gì tôi quan tâm là phương pháp nào được gọi.
Bạn có thể tham khảo bài này: Copy constructors, assignment operators, and exception safe assignment và Default assignment operator
EDIT
Tôi đã phạm sai lầm trước đó. X b = a
chỉ là quá trình khởi tạo. Không có nhiệm vụ được tham gia. Xin lỗi cho thông báo lỗi của tôi.
Bạn cần để khai báo 'b'as' volatile'. – 0x499602D2
Nhưng tôi muốn có một bản sao không dễ bay hơi! – Eric
'volatile X &' không thể được chuyển đổi thành 'const X &' bởi vì hai giá trị mâu thuẫn nhau: 'const' nói" đọc nó một lần, nó sẽ không thay đổi ", trong khi' volatile' nói "đọc nó mọi lúc, bởi vì nó có thể thay đổi". Phải có một số quy tắc thông minh trong tiêu chuẩn C++ cấm thực hiện chuyển đổi này một cách ngầm định. – dasblinkenlight