切片是否有可能与智能指针发生?
-
20-09-2019 - |
题
如果我正确理解切片,我认为指针或明智的指针可能不会发生这种情况。例如,如果您有:
class A
{
int something;
};
class B : public A
{
int stuff;
int morestuff;
};
int main()
{
std::shared_ptr<B> b(new B());
std::shared_ptr<A> a;
a = b;
}
我的理解是,分配给“ B”对象的内存块仍然是相同的,并且在分配给智能指针“ A”时不会更改。
请确认或拒绝我的理解,或让我知道与此相关的任何陷阱。
解决方案
智能指针仍然是指针,因此这样的作业不会导致切片。切片仅在处理价值(而不是指针)时发生。但是请注意,模板不知道该点的项目之间的关系,因此,即使B源自A, shared_pointer<B>
没有衍生 shared_pointer<A>
, ,因此分配不会(自动)像本机指针那样获得自动上的铸造。
编辑:详细说明最后一点。
切片是用价值观而不是指针发生的,因此(考虑到您对A和B的定义),类似:
a ax = b;
会起作用,但会“切片” B对象成为一个对象。但是,如果您有某种模板包含该项目的实例:
template <class T>
class holder {
T t_;
public:
holder &operator=(T const &t) {
t_ = t;
return *this;
}
holder &operator=(holder const &t) { t_ = t; return *this; }
};
现在,如果我们试图将一个值分配给另一个值,例如会导致切片:
holder<A> ha;
holder<B> hb;
A a;
B b;
ha = a;
hb = b;
ha = hb;
我们不会切片。相反,编译器只会给我们一个错误,告诉我们 holder<A>
和 holder<B>
不是相关的类型,因此不会发生分配 - 如果不添加明确的铸件,它就不会编译。
其他提示
你是正确的,但它们不一样:您无法评估 a->stuff
.
不隶属于 StackOverflow