在参数构造中使用std :: move

时间:2015-11-30 11:29:49

标签: c++ c++11 rvalue-reference rvalue

我正在尝试从函数构造一个对象,然后将它传递给一个使用它的函数(并使用它)。这是代码

std::unique_ptr<Object> createObject() {
  auto myobj = std::make_unique<Object>();
  .. modify myobj ..
  return std::move(myobj);
}

void consumeObject(std::unique_ptr<Object>&& robj) {
  myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}


consumeObject(createObject()); // Is this right?

我没有直接使用createObject的rvalue引用,因为我会返回对deallocated memory的引用。

代码中指明的部分是否需要std::move?如果像我在上面的代码中所做的那样,我传递一个rvalue绑定到右值引用会发生什么?代码似乎编译得很好,但我看不出

之间的区别
consumeObject(createObject());

consumeObject(std::move(createObject()));

2 个答案:

答案 0 :(得分:8)

std::move没有做任何魔法,它只是将参数转换为右值。

由于createObject按值返回,createObject()已经是右值(特别是prvalue),因此在这种情况下不需要std::move,您可以安全地省略它。

答案 1 :(得分:3)

std::unique_ptr<Object> createObject() {
  auto myobj = std::make_unique<Object>();
  .. modify myobj ..
  return std::move(myobj);
}

您不需要std::move按值返回本地的仅移动对象。

void consumeObject(std::unique_ptr<Object>&& robj) {
  myvector.emplace_back(std::forward<std::unique_ptr<Object>>(robj));
}

使用std::forward是没有意义的*除非您使用所谓的“转发引用”,但您不在此处。仅拥有&&并不意味着您应该使用std::forward。此外,您根本不需要&&

consumeObject(createObject()); // Is this right?

以下是代码可能应该是什么样子。请注意,您最常避免使用任何C ++ 11特定语法,而代码看起来与按值传递可复制对象几乎相同。这里只有一个地方需要新的东西。

std::unique_ptr<Object> createObject() {
  auto myobj = std::make_unique<Object>();
  .. modify myobj ..
  return myobj;
}

void consumeObject(std::unique_ptr<Object> robj) {
  myvector.emplace_back(std::move(robj));
}


consumeObject(createObject());

* std::forwardstd::move都只是强制转换,你在这里使用std::forward的方式恰好适合于正确的强制转型以获得移动结构。但是为了便于阅读,我们应该只使用std::move移动并仅使用std::forward转发。