Mã không thực sự hoạt động trong VC++ - bạn không cập nhật giá trị (hoặc ít nhất là không nên), do đó cảnh báo từ GCC. mã đúng là
const_cast<myType*&>(myMember) = new myType();
hoặc [từ phản ứng khác, nhờ: P]:
const_cast<ThisType*>(this)->myMember = new myType();
Làm cho nó có thể thay đổi một cách hiệu quả có nghĩa là bạn sẽ có được ngầm const_cast
s trong const
chức năng thành viên, mà nói chung là những gì bạn nên có chỉ đạo hướng tới khi bạn thấy mình đang tải các số const_cast
s trên this
. Không có 'tác dụng phụ để sử dụng mutable' khác hơn thế.
Như bạn có thể thấy từ các cuộc tranh luận kịch liệt xoay quanh câu hỏi này, việc sử dụng một cách rõ ràng mutable
và rất nhiều const_cast
s chắc chắn có thể là các triệu chứng có mùi xấu trong mã của bạn. Từ quan điểm khái niệm, bỏ đi chòm sao hoặc sử dụng mutable
có thể có ý nghĩa lớn hơn nhiều. Trong một số trường hợp, điều chính xác để làm có thể là thay đổi phương thức thành không const, tức là sở hữu thực tế là nó đang sửa đổi trạng thái.
Tất cả phụ thuộc vào mức độ chính xác trong ngữ cảnh của bạn - bạn không muốn kết thúc chỉ cần phun mutable
xung quanh như bụi pixie để làm công cụ, nhưng mutable
được thiết kế để sử dụng nếu thành viên không phải là một phần của quan sát được trạng thái của đối tượng. Quan điểm nghiêm ngặt nhất của const-correctness sẽ giữ rằng không một chút trạng thái của đối tượng có thể được sửa đổi (ví dụ, điều này có thể là quan trọng nếu bạn là instance trong ROM ...) - trong những trường hợp bạn không muốn bất kỳ constness bị mất. Trong các trường hợp khác, bạn có thể có một số trạng thái bên ngoài được lưu trữ ở đâu đó bên ngoài đối tượng - ví dụ: bộ nhớ cache theo chủ đề cụ thể cũng cần được xem xét khi quyết định xem nó có phù hợp hay không.
Nguồn
2009-11-25 12:15:51
Cảm ơn. [min 15 chars] –
Tôi nghĩ rằng trong khi điều này làm việc nó có thể là giải pháp tồi tệ nhất. Nó hoàn toàn ẩn những gì xảy ra (thay đổi trạng thái bên trong của một thể hiện bất biến) trong một const-cast trong hàm thành viên. "có thể thay đổi" sẽ rõ ràng hơn (hoặc sử dụng giao diện). –
bỏ đi constness dẫn đến hành vi không xác định. Sử dụng có nguy cơ của riêng bạn. Một giải pháp tốt hơn sẽ là làm cho phương pháp không const. –