在此上应用const_cast->指针

时间:2014-08-12 12:21:39

标签: c++ pointers this const-cast

我正在玩一些代码来删除变量的常量。

  int *i = new int(202);
  int *j = new int(402);

  int *const iptr = i;    // Constant pointer
  //iptr = j ;           // Not allowed. Constant pointer cannot point to another location.
  (*iptr)++;             // Allowed
  const_cast<int *>(iptr) = j;
  cout<< *iptr           // prints 402

它按预期工作但当我试图去除&#34时的常数时,这个&#34;指针,编译器不允许它,即它在const_cast语句下面显示曲折线。

class A
{
public:
  A(A * obj)
  {
    const_cast<A *>(this) = obj; 
  }
};

当我徘徊鼠标(我正在使用VS2014)时,#34;这个&#34;和&#34; iptr&#34;从早期的代码,我可以看到类型相同,即<classname> *const

有人可以解释一下发生了什么事吗?

干杯,

萨基特

2 个答案:

答案 0 :(得分:3)

我担心你不明白const_cast的用途。

在C ++中,const用于两个实例:

  • 无法更改const对象逻辑值(并禁止mutable字段,也无法更改其按位值)
  • const*const&是只读指针或引用

const_cast不是要改变const个对象,而是通过只读指针或引用修改非const对象

请记住,自己在脚下拍摄很容易,因为当你得到const&时,你怎么知道原始物体是否是const?你不。如果您尝试更改 const出现一个独角兽,或者可能是魔鬼(也称为未定义行为:可能发生任何事情)。< / p>

现在,与this的相关性非常棘手。严格来说,this是一个r值(意味着它只能在= R 右手侧出现,但它通常被描述为简单为了简单起见,constA,因此在this A* const的构造函数中被描述为具有类型const_cast。谢天谢地,即使在这个近似值const中也是个坏主意,因为原始对象是const_cast


因此,建议是:

  • Junior :不要使用reinterpret_cast,{{1}}或C风格的演员表(因为当他们看到前两个演员之一时不明显)。
  • 高级:您的经验不足。
  • 专家:来吧!你怎么能声称自己是专家并试图使用它们?

答案 1 :(得分:2)

this不是l值。

你无法指定它指向别的东西。

您可以执行不需要*this = *obj;

const_cast

您可以执行const_cast<A*>(this)覆盖常量,并且与任何其他const_cast一样充满危险,但它可以使您执行const /非const重载而无需复制实现,例如

T& A::get()
{
 // some complex code to find the right reference, assigning to t
  return t;
}

const T& A::get() const
{
// implement in terms of above function
  return (const_cast<A*>(this))->get(); // invokes above
 // and automatically converts the reference to const
}