先决条件:
要理解这个问题,请先阅读以下问题及其答案:
Cast auto_ptr<Base> to auto_ptr<Derived>
在
Cast auto_ptr<Base> to auto_ptr<Derived> 史蒂夫回答说 “您的 static_cast 会将 auto_ptr 复制到临时文件,因此当临时文件为(在语句末尾)时,将重置 aS 并销毁资源。”
我对调用 static_cast
时临时创建的过程很感兴趣。
我想要我可以跟踪的代码以便看到这种效果。
我不能使用static_cast<auto_ptr<Circle>> ...
,因为它无法编译,所以我需要写一些模拟类而不是auto_ptr
,并观察临时创建的过程。
我也明白临时创建与复制构造函数调用密切相关。auto_ptr
的所有权丢失是通过复制赋值模拟的,该赋值将 source 的 _radius
字段设置为负值(我需要 auto_ptr
的简单逻辑模型)。
所以,我建议使用以下 Circle
类:
#include <iostream>
class Shape {};
class Circle: public Shape {
double _radius;
public:
explicit Circle(double radius = .5): _radius(radius) {}
Circle &operator =(Circle &circle) {
_radius = circle._radius;
circle._radius = -1.;
return *this;
}
Circle(Circle &circle) { *this = circle; }
double GetRadius() { return _radius; }
};
int wmain() {
using namespace std;
Circle c1(100), c2(200), c3(300);
c2 = c3;
Shape *s1, s2;
s1 = &c1;
wcout << static_cast<Circle *>(s1)->GetRadius() << endl;
return 0;
}
好的。在这里我们可以看到在
c2 = c3
中发生了“所有权转移”。但是我无法在
static_cast
中实现临时创建。问题是:如何在
static_cast
的同时进行临时对象创建的小模拟?我相信史蒂夫在类型转换时创建了临时对象。我唯一想要的是 编写一个示例,显示临时创建 。这个目标是有学术原因的。
有人可以澄清如何实现史蒂夫在引用主题上发布的回答中描述的效果吗?
最佳答案
在您之前的问题中, auto_ptr
是拥有所有权的类,并在复制时将源的指针重置为 null。
现在,Circle
是一个模拟所有权的类,通过在复制时将其半径重置为 -1。所以它就像一个 auto_ptr
那样,但不是任何其他方式。
因此,要观察模拟所有权的丢失,您需要复制 Circle
,这就是您对 c2 = c3
行中的复制分配所做的。转换 Circle*
不会复制对象,只是复制指针,但转换 Circle
确实会复制对象:
int main() {
Circle c1(100);
static_cast<Circle>(c1);
std::cout << c1.GetRadius() << '\n';
}
输出为 -1。
或者,如果您特别想通过对派生类的强制转换来查看它:
struct SpecialCircle: Circle {
SpecialCircle(Circle &circle) : Circle(circle) {}
explicit SpecialCircle(double radius = .5): Circle(radius) {}
};
int main() {
SpecialCircle s1(100);
Circle &c1 = s1;
static_cast<SpecialCircle>(c1);
std::cout << c1.GetRadius() << '\n';
}
关于c++ - static_cast 和临时创建(最终版),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8581284/