【发布时间】:2014-08-12 12:21:38
【问题描述】:
我正在使用一些代码来删除变量的恒定性。
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
谁能解释一下幕后发生了什么?
干杯,
酒
【问题讨论】:
-
iptr是一个const对象。在任何情况下修改它都是未定义的行为。所以,const_cast<int *>(iptr) = j;在语义上是错误的(这并不奇怪——你在对编译器撒谎。) -
我们应该添加一个功能,自动回复 5k 代表(是的,包括我)以下用户的
const_cast和reinterpret_cast问题:不要碰这个,你会伤害自己! -
您要分配给
this?有趣,而且完全违法。this被标准定义为纯右值表达式(prvalue = pure rvalue)。它不能出现在作业的左侧。this = ....是不合法的,并且铸造不会改变这一点。参见 C++11 § 9.3.2,p1。 [class.this]。 -
在任何情况下都不能赋值给
this,它的行为就像一个字面量。 -
cout<< *iptr; // prints 402没有按预期工作,因为没有预期,因为它是未定义的行为。进行了一些优化的编译器将在其输出 203 的权利范围内
标签: c++ pointers this const-cast