const_cast
不能取消对象的常量。const_cast
只能从对象的访问路径中删除常量。访问路径是对对象的指针或引用。从访问路径中删除常量对对象本身绝对没有影响。即使您使用const_cast
删除访问路径的常量,那仍然不一定授予您修改对象的权限。能不能做到还是要看对象本身。如果它是 const,则不允许修改它,并且任何尝试这样做都将导致未定义的行为。
例如,这说明了预期用途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
上述合法和有效的唯一原因是它实际上i
是一个非常量对象,我们知道这一点。
如果原始对象确实是常量,那么上面的代码将产生未定义的行为:
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 !!!
C++ 语言不允许你修改常量对象,const_cast
在这里完全无能为力,无论你如何使用它。
mutable
是完全不同的事情。mutable
创建一个即使声明了包含对象也可以合法修改的数据文件const
。从这个意义上说,mutable
确实允许您修改常量对象的[某些指定部分]。const_cast
,另一方面,不能做这样的事情。