vector::push_back操作,保证了如果过程中出现异常,vector不会发生变化。
push_back过程中,可能会因为已有内存空间不够,申请新的内存,同时把原内存中已有的元素,放到新申请的内存中。
这时候,如果移动构造不保证没有异常,就会发生一件事:
为了保证前述性质,不得不调用copy constructor.
代码可以看到不同。
class A{ public: A(const A& rhs){ printf("copy construct\n"); if(rhs.data) { data = new string(*rhs.data); } else { data = NULL; } } A():data(NULL){printf("default construct\n");} A(A&& rhs) /*noexcept*/:data(rhs.data) { printf("move construct\n"); rhs.data = NULL; } ~A(){printf("deconstruct\n");delete data;} private: string *data; };
int main()
{
vector<A> v;
v.resize(5);
A a;
v.push_back(std::move(a));
return 0;
}
可以很明显看出差别