加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 10:12:16 所属栏目:百科 来源:网络整理
导读:我正在尝试从函数构造一个对象,然后将它传递给一个使用它的函数(并使用它).这是代码 std::unique_ptrObject createObject() { auto myobj = std::make_uniqueObject(); .. modify myobj .. return std::move(myobj);}void consumeObject(std::unique_ptrObje
我正在尝试从函数构造一个对象,然后将它传递给一个使用它的函数(并使用它).这是代码

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::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 :: forward和std :: move都只是强制转换,你在这里使用std :: forward的方式恰好适用于正确的强制转换以获得移动构造.但是为了便于阅读,我们应该只使用std :: move来移动并且只使用std :: forward来转发.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读