gpt4 book ai didi

c++ - 在 this-> 指针上应用 const_cast

转载 作者:行者123 更新时间:2023-11-30 00:35:31 24 4
gpt4 key购买 nike

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

  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

谁能解释一下幕后发生的事情?

干杯,

沙克特

最佳答案

恐怕您不明白const_cast 的用途。

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

  • 一个 const 对象的逻辑值不能改变(而且,除非 mutable 字段,它的按位值也不能改变)
  • const*const& 是只读指针或引用

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

请记住,搬起石头砸自己的脚很容易,因为当你得到一个 const& 时,你怎么知道原始对象是否是 const ?你不。如果你试图改变一个const unicorn 出现,或者可能是魔鬼(也称为未定义行为:任何事情都可能发生).

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


因此,建议是:

  • Junior:不要使用 const_castreinterpret_cast 或 C 风格的转换(因为当它们脱糖到其中一个时并不明显前两个)。
  • 前辈:你经验不够。
  • 专家:加油!你怎么能声称自己是专家并试图使用它们?

关于c++ - 在 this-> 指针上应用 const_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25264182/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com