【问题标题】:How should we implement moving for object types?我们应该如何实现对象类型的移动?
【发布时间】:2015-12-15 04:27:21
【问题描述】:

我正在阅读 C++11 中的移动语义,现在我正在尝试了解移动构造函数的实现。假设我们有以下类:

struct A {
    A(){ }
    virtual ~A(){ }
    A(const A&&){ }
};

struct B{
    int i;
    A a;
    virtual ~B(){ }
    B(const B&& b){
        i = b.i;
        i = 0;
        //How to move a??
    }
};

我的问题是如何在B 的一个体内调用A 的移动构造函数?我会使用std::swap,但在寻找它时我发现了一些description。参数是 lvalue 引用类型,因此它与移动语义无关。怎么办?

【问题讨论】:

  • 为什么要通过 const rvalue 引用来获取对象?
  • i = 0; 应该被删除
  • @M.M 为什么?你不能解释一下吗?我认为我们应该删除所有源代码。
  • i 是目的地。也许您的意思是 b.i = 0; 来“擦除”源。但是,除非它对 B 的逻辑状态很重要,否则这不是必需的
  • @M.M 是的,完全正确。我的意思是b.i = 0。那么为什么没有必要呢?我认为,如果我们不将其设置为 0,它就不会移动。

标签: c++ c++11 move-semantics


【解决方案1】:
B(B&& b)
  : i(b.i)
  , a(std::move(b.a))
{
}

请注意,参数不再是 const(它不应该是),所有初始化都可以使用 初始化列表 来完成,以获得最佳效率。

【讨论】:

  • 但在这种情况下,我们不会将源值设置为nullptr 或其他东西......我的意思是执行移动,而不是复制。我对this 的回答有点困惑,他将源设置为nullptr explicitly。
  • @stella:你不需要这样做。
猜你喜欢
  • 1970-01-01
  • 2021-03-24
  • 1970-01-01
  • 1970-01-01
  • 2011-05-22
  • 2021-06-14
  • 1970-01-01
  • 2011-04-14
  • 1970-01-01
相关资源
最近更新 更多