const_cast
không thể hủy bỏ độ chói của đối tượng. const_cast
chỉ có thể xóa constness khỏi đường dẫn truy cập cho một đối tượng. Đường dẫn truy cập là một con trỏ hoặc một tham chiếu đến một đối tượng. Việc xóa bỏ constness khỏi đường dẫn truy cập hoàn toàn không ảnh hưởng đến chính đối tượng đó. Ngay cả khi bạn sử dụng const_cast
để xóa độ mờ của đường dẫn truy cập, điều đó vẫn không nhất thiết cho phép bạn sửa đổi đối tượng. Cho dù bạn có thể làm điều đó hay không vẫn phụ thuộc vào chính đối tượng đó. Nếu đó là const, bạn không được phép sửa đổi nó và bất kỳ nỗ lực nào để làm như vậy sẽ dẫn đến hành vi không xác định.
Ví dụ này minh hoạ mục đích sử dụng của const_cast
int i = 5; // non-constant object
const int *p = &i; // `p` is a const access path to `i`
// Since we know that `i` is not a const, we can remove constness...
int *q = const_cast<int *>(p);
// ... and legally modify `i`
*q = 10;
// Now `i` is 10
Lý do duy nhất ở trên là hợp pháp và hợp lệ là một thực tế rằng i
thực sự là một tổ chức phi liên tục đối tượng , và chúng tôi biết về nó .
Nếu đối tượng ban đầu là thực sự liên tục, sau đó các mã trên sẽ tạo ra hành vi undefined:
const int j = 5; // constant object
const int *p = &j; // `p` is a const access path to `j`
int *q = const_cast<int *>(p); // `q` is a non-const access path to `j`
*q = 10; // UNDEFINED BEHAVIOR !!!
ngôn ngữ C++ không cho phép bạn chỉnh sửa các đối tượng liên tục và const_cast
là hoàn toàn bất lực ở đây, bất kể cách bạn sử dụng nó.
mutable
là một điều hoàn toàn khác. mutable
tạo một dữ liệu được lưu có thể được sửa đổi một cách hợp pháp ngay cả khi đối tượng chứa được khai báo const
. Theo nghĩa đó, mutable
không cho phép bạn sửa đổi [một số phần được chỉ định của] đối tượng liên tục. const_cast
, mặt khác, không thể làm bất cứ điều gì như thế.