好的,我先提出代码,然后问我的问题。
#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”源向量的指针元素。 std :: vector类的实现是否已经为我处理了这个?
答案 0 :(得分:2)
std::vector
的实现为您处理。
答案 1 :(得分:1)
std :: vector类将为您处理此问题。实际上在这种情况下,您可以使用隐式生成的移动构造函数。此外,如果您的构造函数采用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移动到构造函数中以保存另一个副本。