std :: move对比std :: forward

马丁·约克

这似乎是已经提出的最相关的问题。

std :: move和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;
    }
};

我将所有这三个功能都包括在内,以将这三个功能与前面提到的答案中提供的答案进行比较。主要原因是它moveconstruct外观如此相似,以至于感觉它们应该相同。

回答@Potatoswatter得分67

std :: forward有一个用例:强制转换模板化函数参数

根据这个定义,我应该使用std::moveinside push_back(T&& value)moveBackInternal(T&& value)因为该值不是该函数的模板参数。

回答@Howard Hinnant得分38

如果Y是左值引用,则结果将是左值表达式。如果Y不是左值引用,则结果将是右值(精确地说是xvalue)表达式。

根据这个定义,我可以使用std::movestd::forward

回答@Bo Persson得分11

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不是引用类型-因此我们得到一个右值。

无论哪种方式,我们在相同的点结束-我们称之为moveBackInternalvalue塑像作为右值。只是move()到达那里的一种简单方法。forward<T> 可以,但是没有必要。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章