std :: move会导致切片吗?

时间:2010-07-22 03:21:25

标签: c++ dynamic std move-semantics object-slicing

例如,在

unique_ptr<Derived> = new deriv;
std::vector<unique_ptr<Base>>.push_back(std::move(deriv));

将派生切片到unique_ptr<Base>

3 个答案:

答案 0 :(得分:6)

不会发生切片; unique_ptr<Base>将拥有指向Derived对象的指针。

派生类的unique_ptr可以隐式转换为unique_ptr到基类。

答案 1 :(得分:2)

(你的例子在当前的编辑中没有编译,我只是假设你的意图)

不,它没有。切片是指将Derived对象复制到Base对象中,而不是将Derived指针复制到Base指针中(此处,unique_ptr是红色鲱鱼)。

这导致切片:

class a { };

class b : public a { };

void foo(a myvar) { };

int main()
{
    b myb;
    foo(myb);
}

这不是:

class a { };

class b : public a { };

void foo(a* myvar) { };

int main()
{
    b myb;
    foo(&myb);
}

答案 2 :(得分:1)

可能发生的任何切片都会发生在容器的元素类型上。间接包含的对象不受影响。