我正在玩一些代码来删除变量的常量。
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
有人可以解释一下发生了什么事吗?
干杯,
萨基特
答案 0 :(得分:3)
我担心你不明白const_cast
的用途。
在C ++中,const
用于两个实例:
const
对象逻辑值(并禁止mutable
字段,也无法更改其按位值)const*
或const&
是只读指针或引用 const_cast
不是要改变const
个对象,而是通过只读指针或引用修改非const对象
请记住,自己在脚下拍摄很容易,因为当你得到const&
时,你怎么知道原始物体是否是const
?你不。如果您尝试更改 const
,出现一个独角兽,或者可能是魔鬼(也称为未定义行为:可能发生任何事情)。< / p>
现在,与this
的相关性非常棘手。严格来说,this
是一个r值(意味着它只能在=
的 R 右手侧出现,但它通常被描述为简单为了简单起见,const
是A
,因此在this
A* const
的构造函数中被描述为具有类型const_cast
。谢天谢地,即使在这个近似值const
中也是个坏主意,因为原始对象是const_cast
。
因此,建议是:
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
}