如果我想转发要在 C++ 中移动的变量,最佳做法是什么?

What is the best practice if I want to forward a variable to be moved in C++?

#include <utility>
class SomeObject {
// ...Object Definition
};

void B(SomeObject& so)
{
    SomeObject movedTo = std::move(so);
}

void A(SomeObject& so)
{
    B(so);
}

int main()
{
    SomeObject movedFrom;
    A(movedFrom);

    return 0;
}

比如现在我有两个函数A和B,函数A可能先做一些事情,然后把参数so传递给函数B,在函数B中,我将传递的参数so.让我很困惑的是还有另一种方法可以做到这一点:

#include <utility>
class SomeObject {
// ...Object Definition
};

void B(SomeObject&& so)
{
    SomeObject movedTo = std::move(so);
}

void A(SomeObject&& so)
{
    B(std::move(so));
}

int main()
{
    SomeObject movedFrom;
    A(std::move(movedFrom));

    return 0;
}

在第二个版本中,函数A和B的参数是右值引用。这两个代码都可以编译,并且都运行良好。那么,做这种事情,哪一个是更好的做法呢?

void B(SomeObject& so)
{
    SomeObject movedTo = std::move(so);

这是一个糟糕的设计。不要从左值引用参数移动。这会误导程序员,他们根据参数类型做出合理的假设,并且不希望他们传递的参数被移动。

In the second version, the parameter of function A and B are rvalue references.

这样好多了。期望从中移动右值引用是合理的。

So, which one is the better practice of doing such kind of thing?

第二个,毫无疑问


What is the best practice if I want to forward

你不是在“转发”这个词的常用用法。通常所谓的转发是从左值复制并从右值移动。您可以通过使用值参数而不是引用来实现:

void B(SomeObject so)
{
    SomeObject movedTo = std::move(so);
}

这样调用者可以以低成本移动对象参数,或者在他们不希望从中移动参数时复制它。

SomeObject so;
B(so);            // copy
B(std::move(so)); // move