假设我有以下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个副本。
答案 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
功能正确且仅在"同一对象"中生成一个副本。情况下。