C++11右值引用

来源:互联网 发布:女权运动 知乎 编辑:程序博客网 时间:2024/06/04 19:40
C++左值和右值的理解:(右值引用详解和深入理解右值引用)
    C语言的左值右值由赋值运算符(=)决定;
    C++的左值、右值由表达式决定:表达式结束后依然存在的对象,右值表达式结束后就不存在的临时对象。
    (对对象取地址,能取到地址的就是左值,不能取到地址的就是右值)
    c++11支持std::move()把左值对象切换成右值对象。

C++11右值引用:
    形如typeName&& object;声明对象的方式通常都是右值引用,除了&&做模板参和auto&&自动类型推导时
    有可能是右值也有可能是左值。
    右值引用也分const右值引用和非const右值引用:
        非常量右值引用只能绑定到非常量右值;
        常量右值引用可以绑定到非常量右值和常量右值;
    左值引用:
        非常量左值引用只能绑定到非常量左值;

        常量左值引用可以绑定到所有类型的值,包括非常量左值、常量左值、非常量右值和常量右值。

class CMyString{public:    // 构造函数    CMyString(const char *pszSrc = NULL)    {        cout << "CMyString(const char *pszSrc = NULL)" << endl;        if (pszSrc == NULL)        {            m_pData = new char[1];            *m_pData = '\0';        }        else        {            m_pData = new char[strlen(pszSrc) + 1];            strcpy(m_pData, pszSrc);        }    }    // 拷贝构造函数    CMyString(const CMyString &s)    {        cout << "CMyString(const CMyString &s)" << endl;        m_pData = new char[strlen(s.m_pData) + 1];        strcpy(m_pData, s.m_pData);    }    // move构造函数     ----        实质上就是·窃取·临时对象,注意参数的形式    CMyString(CMyString &&s)    {        cout << "CMyString(CMyString &&s)" << endl;        m_pData = s.m_pData;        s.m_pData = NULL;    }    // 析构函数    ~CMyString()    {        cout << "~CMyString()" << endl;        delete[] m_pData;        m_pData = NULL;    }    // 拷贝赋值函数    CMyString &operator =(const CMyString &s)    {        cout << "CMyString &operator =(const CMyString &s)" << endl;        if (this != &s)        {            delete[] m_pData;            m_pData = new char[strlen(s.m_pData) + 1];            strcpy(m_pData, s.m_pData);        }        return *this;    }    // move赋值函数    CMyString &operator =(CMyString &&s)    {        cout << "CMyString &operator =(CMyString &&s)" << endl;        if (this != &s)        {            delete[] m_pData;            m_pData = s.m_pData;            s.m_pData = NULL;        }        return *this;    }private:    char *m_pData;};
    CMyString cs1("1234");         // CMyString(const char *pszSrc = NULL)
    CMyString cs2(std::move(cs1));   // CMyString(CMyString &&s)
    CMyString cs3 = std::move(cs1); // CMyString(CMyString &&s)
    CMyString cs4;          // CMyString(const char *pszSrc = NULL)
    cs4 = std::move(cs1); // CMyString &operator =(CMyString &&s)