c++11 std::move\移动构造\引用相关释义
- 先说 std::move的作用,std::move 就是帮助实现,当参数为左值的时候,如何调用 对象的移动构造函数而非拷贝构造函数。
- 移动构造函数与拷贝构造函数的区别:
拷贝构造的参数是const MyString& str,是常量左值引用,而移动构造的参数是MyString&& str,是右值引用。
移动构造函数与拷贝构造不同,它并不是重新分配一块新的空间,将要拷贝的对象复制过来,而是"偷"了过来,将自己的指针指向别人的资源,然后将别人的指针修改为nullptr。
c++11中的所有容器都实现了move语义,move只是转移了资源的控制权,本质上是将左值强制转化为右值使用,以用于移动拷贝或赋值,避免对含有资源的对象发生无谓的拷贝。
C++11提供了std::move()方法来将左值转换为右值,从而方便应用移动语义,就是告诉编译器,虽然我是一个左值,但是不要对我用拷贝构造函数,而是用移动构造函数。
- 关于引用
(1)左值引用, 使用 T&, 只能绑定左值
(2)右值引用, 使用 T&&, 只能绑定右值
(3)常量左值, 使用 const T&, 既可以绑定左值又可以绑定右值
(4)T&&在模板参数中表示万能引用,在非模板参数中表示右值引用。
class Test { public: Test() {}; ~Test() {}; void func(const int &i) { std::cout << "This is Test::func "<<std::endl; } Test(const Test& t) { std::cout << "Test copy construct "<< std::endl; } Test(Test &&t) { std::cout << "Test move copy construct "<< std::endl; } }; int main (int argc, char *argv[]) { Test t; Test tt; std::vector<Test> list; list.push_back(t); //Test copy construct list.push_back(std::move(tt)); //Test move copy construct return 0; }