这似乎是已经问过的最相关的问题。std :: move VS std ::转发
Whats the difference between std::move and std::forward
但每次的答案都是不同的,适用,并说略有不同的东西。所以我很困惑。
我有以下情况。
- 复制项目到容器
复印产品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
和construct
看起来非常相似,所以感觉应该是相同的。
Answer @Potatoswatter Score 67
的std ::向前有一个单一的用例:施放模板函数参数
按照这个定义,我应该使用std::move
内push_back(T&& value)
和 moveBackInternal(T&& value)
作为值不是函数的模板参数。
Answer @Howard Hinnant Score 38
如果Y是一个左值参考,其结果将是一个左值表达式。 如果Y不是一个左值引用,则结果将是一个右值(xvalue是精确的)表达式。
似乎按此定义,我可以使用std::move
或std::forward
。
的std ::向前来转发参数正是它被传递给函数的方式。
似乎可以说,std::forward
是可以接受的(尽管如果我按照答案中的链接,所有的例子都使用模板化函数)。
呃...你的问题没有被链接的答案回答? – Barry
呃......哪个答案是正确的!每个人都指定了不同的结果。 –
他们都是正确的。两个只是说'std :: forward'的意图是用于转发引用,第三个额外花费一些时间来解释'std :: forward'是什么。 – Barry