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

c – 双参数和移动语义

发布时间:2020-12-16 06:53:07 所属栏目:百科 来源:网络整理
导读:假设我有以下foo函数: Widget foo(Widget lhs,Widget rhs) { return lhs.bar(rhs);} 然后我想在双方使用相同的论点: Widget baz(Widget w) { return foo(w,w);} Widget很大,我想避免复制太多.假设bar就位,我可以执行以下操作: Widget baz(Widget w) { ret
假设我有以下foo函数:

Widget foo(Widget lhs,Widget rhs) {
  return lhs.bar(rhs);
}

然后我想在双方使用相同的论点:

Widget baz(Widget w) {
  return foo(w,w);
}

Widget很大,我想避免复制太多.假设bar就位,我可以执行以下操作:

Widget baz(Widget w) {
  return foo(std::move(w),w);
}

这只会制作一份副本.但我担心这是错误的代码,因为在C中未指定参数传递顺序,我可能会给出一个移动的参数.

相反,我做了以下事情:

Widget baz(Widget w) {
  Widget w_bis(w);
  return foo(std::move(w),std::move(w_bis));
}

我是否过于谨慎?有没有更简单的方法来实现这一目标?

注意:foo的设计使得我可以更自然地编写表达式,同时享受复制省略的好处. t = foo(foo(x,y),foo(std :: move(t),z))只执行3个所需的副本.

解决方法

给出你的评论让我们说吧,bar是一个就地函数,我想转换成一个更经典的数学运算符(无副作用),让我们从运算符=运算符的方式中获取灵感:

改变foo以通过const引用获取rhs并让编译器决定如何处理lhs:

Widget foo(Widget lhs,const Widget& rhs)
{
  return lhs.bar(rhs);
}

现在你的原始baz函数是正确的,只能在“同一对象”的情况下制作一个副本.

(编辑:李大同)

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

    推荐文章
      热点阅读