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函数是正确的,只能在“同一对象”的情况下制作一个副本.
总结以上是内存溢出为你收集整理的c – 双参数和移动语义全部内容,希望文章能够帮你解决c – 双参数和移动语义所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)