2

我正在使用一些代码来消除变量的恒定性。

  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

它按预期工作,但是当我尝试删除“this”指针的恒定性时,编译器不允许它,即它在 const_cast 语句下方显示波浪线。

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

当我将鼠标(我使用 VS2014)悬停在早期代码中的“this”和“iptr”上时,我可以看到类型相同,即<classname> *const

谁能解释一下引擎盖下发生了什么?

干杯,

萨克特

4

2 回答 2

4

恐怕你不明白这const_cast是为了什么。

在 C++ 中,const用于两种情况:

  • const对象逻辑值不能更改(并且,除了字段,它的mutable按位值也不能更改)
  • const*或者const&是只读指针或引用

const_cast不是关于更改const对象,而是关于通过只读指针或引用修改非常量对象

请记住,虽然射击自己的脚很容易,因为当你得到一个时,你const&怎么知道原始物体是否是const?你不。如果你试图改变一个,那就是独角兽 出现,或者可能是魔鬼(也称为未定义行为:任何事情都可能发生)。const

现在,与的相关性this很棘手。严格来说是一个rthis值(意味着它只能按原样出现在 的右侧),尽管为了简单起见,它通常被简单地描述为,因此在构造函数中被描述为具有 type 。值得庆幸的是,即使在这种近似中也是一个坏主意,因为原始对象是.=constA thisA* constconst_castconst


因此,建议是:

  • Junior:不要使用const_cast,reinterpret_cast或 C 风格的演员表(因为当他们对前两者之一脱糖时并不明显)。
  • 前辈:你经验不够。
  • 专家:加油!您如何声称自己是专家并尝试使用它们?
于 2014-08-12T12:54:07.913 回答
3

this不是左值。

您不能将其分配为指向其他内容。

你可以做*this = *obj;不需要const_cast

您可以执行 aconst_cast<A*>(this)来覆盖 constness,并且与任何其他 const_cast 一样充满危险,但它可以让您执行 const/non-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
}
于 2014-08-12T13:03:18.847 回答