gpt4 book ai didi

c++ - 双参数和 move 语义

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:26 25 4
gpt4 key购买 nike

假设我有以下 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 是一个就地函数,我想将其转换为更经典的数学运算符(无副作用),让我们从我们如何编写operator+operator+= 方面:

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

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

现在您的原始 baz 函数是正确的并且在“相同对象”的情况下只生成一个拷贝。

关于c++ - 双参数和 move 语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41898259/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com