右值:只能放在=右边,作用于完该行就销毁的临时对象
右值引用:偷取即将销毁的对象的内存以提高效率
#include <iostream> class Buffer { public: Buffer() { this->a = new int[10]; } Buffer(const Buffer& buffer) {//深拷贝 std::cout << "深拷贝" << std::endl; this->a = new int[10]; for (int i = 0; i < 10; ++i) *this->a = *buffer.a; } //移动构造 Buffer(Buffer&& buffer) {//右值引用 std::cout << "右值引用" << std::endl; this->a = buffer.a; buffer.a = new int; } ~Buffer() { delete[] this->a; } private: int* a; }; Buffer getBuffer() { Buffer buffer; return buffer; } int main(void) { Buffer a; Buffer b = getBuffer(); return 0; }
对于getBuffer返回的临时对象立马就会被销毁,右值引用的思想就是:既然你没有用了那不如借我用用,免得我又创造空间,又要把你的内容搬运一遍。然后我给你一个很小的内存让你去销毁
这种构造函数就称为:移动构造。
std::move()将括号内的左值以右值的逻辑运作。