【问题标题】:Proper way to implement move semantics for class with std::vector of std::vector member使用 std::vector 成员的 std::vector 为类实现移动语义的正确方法
【发布时间】:2011-11-25 23:09:09
【问题描述】:

我有一个类,它的成员是向量的向量。我想为这个类编写一个构造函数,它将对单个向量的 r 值引用作为参数,并将其作为向量参数的单个元素向量移动到成员向量中。到目前为止,我有:

class AClass
{
    std::vector<std::vector<int>> member;

public:

    AClass(std::vector<int> &&vec) : member(1) 
    {
        member[0] = std::vector<int>(std::move(vec));
    }
}

这似乎工作正常,但我不确定vec 周围的std::move 是否是必要的。或者如果我写的有点不同,std::vector 会为我处理很多事情。

【问题讨论】:

    标签: c++ c++11 stdvector move-semantics


    【解决方案1】:

    应该写得更短:

    member[0] = std::move(vec);
    

    为了调用

    vector<T,Allocator>& operator=(vector<T,Allocator>&& x);
    

    据我所知,显式移动是必要的,因为vec 不是右值(它是一个命名变量,可以在operator= 的左侧使用)。

    【讨论】:

      【解决方案2】:

      现在这样做的方法就是将值按值传递给构造函数,然后将其移动到您想要的位置。所以

      AClass(std::vector<int> vec)
      {
          member.emplace_back(std::move(vec));
      }
      

      你不需要关心这个值是否是复制构造的,或者它是否能够被移动到构造函数中,因为它是一个右值,或者其他什么。您只需在函数定义中请求获取您自己的项目副本,该语言会尽可能地为您提供。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-05
        • 2021-12-12
        • 2013-10-17
        • 1970-01-01
        • 1970-01-01
        • 2018-02-02
        • 2022-01-03
        • 2013-04-12
        相关资源
        最近更新 更多