一直以来以为右值引用的误区终于搞懂了。

误区

误区一:右值引用是编译期通过指针实现的

原来以为右值引用是编译期给你完成的,自己不需要做任何事情,就可以实现高效,以为编译期是内部通过指针来实现的。

右值引用好用,需要自己写右值引用构造右值引用拷贝,当符合右值转移的条件时,会自动调用下面这两个函数,如果你不写的话,还是会调用拷贝构造函数。


A& operator=(const A&& r)
A(const A&& r)

当然stl里面的类都已经写好右值引用构造和右值引用拷贝。

右值引用后,右值不再析构

这个误区产生的原因和上面类似,其实右值还是一个对象,还会正常析构,只不过析构时不再回收资源,资源已经被挪走。

右值引用的机制

右值引用调用的时机如下:

  • 参数为右值时。
  • 参数为左值,但是通过std::move转化为右值时。

c++11 加入右值引用特性,是给你个机会,当以上两种情况满足其一时,可以调用你写的右值函数,如果你不写,就会调用普通的拷贝构造函数和赋值函数。

实验的小例子

class A
{
public:
    A()
    {
        cout << "new A" << endl;
    }
    ~A()
    {
        cout << "del A" << endl;
    }

    A(const A& r)
    {
        cout << "copy A" << endl;
    }
    A(const A&& r)
    {
        cout << "&& copy A" << endl;
    }

    A& operator=(const A& r)
    {
        cout << "= A" << endl;
    }
    A& operator=(const A&& r)
    {
        cout << "&& = A" << endl;
    }
    string name;
};

static A make_A()
{
    cout << ""<<endl;
    return A();
}

static void test_move()
{
    A aa = make_A();
    A bb = std::move(aa);
    A ee(bb);
    A cc(std::move(aa));
    A dd(make_A());
}

输出

new A
&& copy A
copy A
&& copy A

new A