这似乎是已经提出的最相关的问题。
std::move 和 std::forward 有什么区别 https://stackoverflow.com/q/9671749/14065
但每个答案都是不同的,适用的内容也略有不同。所以我很困惑。
我有以下情况。
-
将项目复制到容器中
Copy 项目是 C++03,所以我对此很了解。
-
将项目构建到容器中
我相信将项目构造到容器中正确使用了完美转发,通过两个函数将参数转发到 T 的构造函数emplaceBackInternal()
(如果我错了,请另外说)。
-
将项目移动到容器中
我的问题似乎是理解将物品移动到容器中。
代码:
template<typename T>
class Container
{
std::size_t length;
T* buffer;
public:
void push_back(T const& value)
{
resizeIfRequired();
pushBackInternal(value);
}
template<typename... Args>
void emplace_back(Args&&... args)
{
resizeIfRequired();
emplaceBackInternal(std::forward<T>(arg)...);
}
void push_back(T&& value)
{
resizeIfRequired();
// Is this forward correct or should it be move
moveBackInternal(std::forward<T>(value));
}
private:
void pushBackInternal(T const& value)
{
// Copy construct object into buffer;
new (buffer + length) T(value);
++length;
}
template<typename... Args)
void emplaceBackInternal(Args&&... args)
{
// Construct object into buffer using arguments;
new (buffer + length) T(std::forward<T>(args)...);
++length;
}
void moveBackInternal(T&& value)
{
// Move construct object into buffer;
// Is this forward correct or should it be move
new (buffer + length) T(std::forward<T>(value));
++length;
}
};
我将这三个函数都包含在这里,以便将这三个函数与前面提到的答案中提供的答案进行比较。主要原因是move
and construct
看起来如此相似,感觉它们应该是一样的。
回答@Potatoswatter 得分 67 https://stackoverflow.com/a/9716708/14065
std::forward 有一个用例:强制转换模板化函数参数
根据这个定义我应该使用std::move
inside push_back(T&& value)
and
moveBackInternal(T&& value)
因为该值不是函数的模板参数。
回答@Howard Hinnant 得分 38 https://stackoverflow.com/a/9672202/14065
如果 Y 是左值引用,则结果将是左值表达式。如果 Y 不是左值引用,则结果将为右值(准确地说是 xvalue)表达式。
根据这个定义,我似乎可以使用std::move
or std::forward
.
回答@Bo Persson 得分 11 https://stackoverflow.com/a/9671852/14065
std::forward 用于完全按照传递给函数的方式转发参数。
好像是这么说的std::forward
是可以接受的(尽管如果我点击答案中的链接,所有示例都使用模板化函数)。