据我了解,mutable取消了变量的constness

Class A {
  void foo() const {
  m_a = 5;
}
mutable int m_a;
};

而且const_cast:
void print (char * str)
{
  cout << str << endl;
}

int main () {
  const char * c = "this is a line";
  print ( const_cast<char *> (c) );
  return 0;
}

那么,一个与另一个之间有什么变化?

谢谢

最佳答案

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不能做类似的事情。

10-08 18:29