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;
}
原文地址:https://www.cnblogs.com/rayfloyd/p/14308832.html