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函数是正确的,只能在“同一对象”的情况下制作一个副本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |