繁体   English   中英

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

[英]Use of std::move in parameter construction

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

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内存的引用。

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

consumeObject(createObject());

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

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

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

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 此外,您根本不需要&& here。

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来转发。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM