如果我想转发要在 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
#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