一直以来以为右值引用的误区终于搞懂了。
误区
误区一:右值引用是编译期通过指针实现的
原来以为右值引用是编译期给你完成的,自己不需要做任何事情,就可以实现高效,以为编译期是内部通过指针来实现的。
右值引用好用,需要自己写右值引用构造和右值引用拷贝,当符合右值转移的条件时,会自动调用下面这两个函数,如果你不写的话,还是会调用拷贝构造函数。
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