【问题标题】:Does std::move result in slicing?std::move 会导致切片吗?
【发布时间】:2010-07-22 03:21:24
【问题描述】:

例如,在

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

将派生分割成类型unique_ptr&lt;Base&gt;?

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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);
      }
      

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 2019-09-28
          • 1970-01-01
          • 2017-08-05
          • 1970-01-01
          • 2011-11-29
          • 2018-10-18
          • 2013-09-09
          • 2019-04-04
          • 2013-11-23
          相关资源
          最近更新 更多