这似乎是已经提出的最相关的问题。
std :: move和std :: forward之间有什么区别
但是每个答案都是不同的,适用的说法略有不同。所以我很困惑。
我有以下情况。
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
外观如此相似,以至于感觉它们应该相同。
std :: forward有一个用例:强制转换模板化函数参数
根据这个定义,我应该使用std::move
inside push_back(T&& value)
,moveBackInternal(T&& value)
因为该值不是该函数的模板参数。
如果Y是左值引用,则结果将是左值表达式。如果Y不是左值引用,则结果将是右值(精确地说是xvalue)表达式。
根据这个定义,我可以使用std::move
或std::forward
。
std :: forward用于将参数完全传递给函数的方式进行转发。
似乎可以std::forward
接受(尽管如果我按照答案中的链接,所有示例都使用模板化函数)。
在这种情况下:
void push_back(T&& value)
{
resizeIfRequired();
moveBackInternal(std::forward<T>(value)); // (1)
moveBackInternal(std::move(value)); // (2)
}
std::forward<T>(value)
并且在这种情况下std::move(value)
是相同的((1)
和之间没有关系(2)
... ...因此使用(2)
)。
move
是无条件强制转换为xvalue。该行T&&
始终为您提供类型为右值的表达式。
forward
是有条件的演员。如果T
是左值引用类型,则产生左值。否则(如果不是引用类型也不是右值引用类型),则产生右值。在我们的情况下,T
不是引用类型-因此我们得到一个右值。
无论哪种方式,我们在相同的点结束-我们称之为moveBackInternal
与value
塑像作为右值。只是move()
到达那里的一种简单方法。forward<T>
可以,但是没有必要。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句