c – 双参数和移动语义

c – 双参数和移动语义,第1张

概述假设我有以下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) { re 假设我有以下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函数是正确的,只能在“同一对象”的情况下制作一个副本.

总结

以上是内存溢出为你收集整理的c – 双参数和移动语义全部内容,希望文章能够帮你解决c – 双参数和移动语义所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1225012.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存