接受变量并返回一个元组进行突变

时间:2019-02-10 21:52:27

标签: c++ design-patterns c++17

我正在尝试通过将几个变量的状态传递给函数来更改它们的状态,但没有将它们作为引用传递。我发现输入变量并将其返回更干净。

我不喜欢这么频繁地使用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));
}

1 个答案:

答案 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不同的线程中执行,则销毁。按值传递参数避免了设计引起的混乱。