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
不能做那样的事情。
来源
2012-07-12 18:17:14
AnT