我正在尝试通过将几个变量的状态传递给函数来更改它们的状态,但没有将它们作为引用传递。我发现输入变量并将其返回更干净。
我不喜欢这么频繁地使用std::move
,但是看起来我不得不使用它们来避免复制?
以下方法可以吗,还是更多的反模式?
std::tuple<A, B> foo(A a, B b) {
// Some logic that needs A and B
// Mutates A and B
return std::make_tuple(std::move(a), std::move(b));
}
int main() {
A a;
B b;
std::tie(a, b) = foo(std::move(a), std::move(b));
}
答案 0 :(得分:0)
您的解决方案是完全正确的:如果要通过调用以下任一方法制作副本,则该函数的签名会将其留给调用方:
foo(a, b)
或将对象移入函数:
foo(std::move(a), std::move(b))
后者不涉及任何复制,因此具有良好的运行时性能(前提是A和B的move构造函数是“便宜的”)。
此外,函数的输入/输出设计是首选(根据https://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines#Rf-out),而不是使用“ IN / OUT”参数。
最后但并非最不重要的是,在多线程程序中,按引用传递可能导致访问悬空引用,例如。 G。如果foo在与a / b不同的线程中执行,则销毁。按值传递参数避免了设计引起的混乱。