双参数和移动语义

时间:2017-01-27 16:07:55

标签: c++ move-semantics

假设我有以下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个副本。

1 个答案:

答案 0 :(得分:0)

根据您的评论Let say, bar is an in-place function that I would like to transform into a more classical mathematical operator (side-effect free),让我们从operator+方面的operator+=中获取灵感:

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

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

现在您的原始baz功能正确仅在"同一对象"中生成一个副本。情况下。