【发布时间】:2016-07-08 15:06:58
【问题描述】:
这似乎是已经问过的最相关的问题。
Whats the difference between std::move and std::forward
但是每个答案都是不同的,适用的并且说的东西略有不同。所以我很困惑。
我有以下情况。
-
将项目复制到容器中
Copy 项是 C++03,所以我理解得很好。 -
将项目构造到容器中
我认为将 Construct item into container 正确地使用了完美转发,通过两个函数将参数转发到emplaceBackInternal()中的 T 的构造函数(如果我错了,请另说)。 -
将项目移动到容器中
我的问题似乎是理解将项目移动到容器中。
代码:
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和construct长得很像,感觉应该是一样的。
Answer @Potatoswatter Score 67
std::forward 有一个用例:强制转换 模板函数参数
根据这个定义,我应该在 push_back(T&& value) 内使用 std::move 和
moveBackInternal(T&& value) 因为该值不是函数的模板参数。
Answer @Howard Hinnant Score 38
如果 Y 是左值引用,则结果将是左值表达式。 如果 Y 不是左值引用,则结果将是右值(准确地说是 x 值)表达式。
按照这个定义,我可以使用std::move 或std::forward。
std::forward 用于将参数完全按照传递给函数的方式转发。
似乎说std::forward 是可以接受的(尽管如果我点击答案中的链接,所有示例都使用模板函数)。
【问题讨论】:
-
呃...链接的答案没有回答您的什么问题?
-
呃...哪个答案是正确的!。每个都指定不同的结果。
-
他们都是正确的。两个只是说
std::forward的目的是转发引用,第三个还花一些时间解释std::forward是什么。
标签: c++ c++11 move perfect-forwarding