c++ 11实现移动构造函数和移动成员向量



好的,我先把代码放上去,然后再问我的问题。

#include<vector>
#include<string>
using std::vector;
using std::string;
class MyStringContainer
{
public:
   MyStringContainer(vector<string> strVec): _strVec(strVec){;}
   MyStringContainer(MyStringContainer&& rhs): _strVec(move(rhs._strVec)){;}
private:
   vector<string> _strVec;
}
int main()
{
  vector<string> dummyVec(1000000, "arbitrary string");
  MyStringContainer strCon1(dummyVec);
  MyStringContainer strCon2(move(strCon1));
}

所以我只是花了一些时间学习移动语义,我想我得到了它的基本概念,关于如何交换原始和/或智能指针,并设置丢弃的指针为nullptr。然而,当处理向量(以及所有实现移动语义的容器)时,我不能100%确定我上面的代码是否会正确地"nullptr"源向量的指针元素。vector类的实现是否已经为我处理了这个问题?

std::vector的实现为您处理此问题。

std::vector类将为您处理此问题。实际上,在这种情况下,您可以使用隐式生成的move构造函数。此外,如果您的构造函数按值接受vector<string>,这很好,您可能希望使用std::move将其移动到成员变量中以保存副本:

#include<vector>
#include<string>
class MyStringContainer {
private:
   std::vector<std::string> strVec_;
public:
   MyStringContainer(std::vector<std::string> strVec): strVec_(std::move(strVec)){ }
};
int main()
{
  std::vector<std::string> dummyVec(1000000, "arbitrary string");
  MyStringContainer strCon1(std::move(dummyVec));
  MyStringContainer strCon2(std::move(strCon1));
}

注意,我使用std::move将dummyVec移动到构造函数中,以保存另一个副本。

最新更新