#我想写一个关于移动构造函数和移动赋值运算符的新手笔记
1.std::move的作用只是返回一个右值引用。
2.也许值得思考的是为什么不把左值引用也变成移动而非构造的。我的理解是对于vector和string这样本身就是行为类值的类只有在特殊情况下才应该移动。
3.那么定义移动构造和移动赋值的意义何在?移动构造和移动赋值不同于普通的拷贝构造和赋值,其只要保留指针并且把移后源对象至于可析构的状态就可以。
4.记录一下我之前不理解的一段代码
void StrVec::reallocate()
{
auto newcapacity = size() ? 2 * size() : 1;
//未销毁之前的内存,只是新建而已
auto newdata = alloc.allocate(newcapacity);
auto dest = newdata;
auto elem = elements;
for (size_t i = 0; i != size(); i++)
alloc.construct(dest++, std::move(*elem++));
//直接清除掉所有内存
free();
elements = newdata;
first_free = dest;
cap = elements + newcapacity;
}
这里用*elem的右值引用对string初始化时调用了string的移动构造函数,我的想法是string的移动构造函数肯定也是只拷贝指针然后将移后源的指针置为nullptr.这样再调用free就没有任何问题了
p.s.这段代码是c++primer469上的。