Open bosthhe1 opened 1 year ago
class A
{
public:
A()
{
cout << "A()" << endl;
}
A(A&& _a)//实际这里移动构造的用途是使用现代写法进行交换,提高效率,如果没有移动构造,func函数会走拷贝构造,代价大
{
cout << "A&& _a" << endl;
}
A func()//如果没有移动构造,那么tmp返回会进行深拷贝,这里有移动构造,代价比深拷贝小很多
{
A tmp;
return tmp;
}
~A()
{
cout << "~A()" << endl;
}
private:
size_t _size = 0;
};
int main()
{
A a;
A b = a.func();
return 0;
}
这里为什么会去调移动构造或者拷贝构造,是因为编译器去调用最匹配的那个,如果值为左值那么就去调用拷贝构造,如果值为右值那么就去调移动构造
首先我们需要知道左值引用和右值引用都是对引用对象取别名,左值引用是可以对引用对象取地址,而右值引用不可以对引用对象取地址,左值是可以出现在赋值符号左右边,而右值只能出现在赋值符号右边,左值加const引用可以引用右值,右值引用只能引用右值,右值引用的本质是,将右值开空间,拿给右值引用 右值分为纯右值和将亡值,将亡值就是函数的返回值不能应用返回的值,出了作用域就会销毁 左值是在内存中开辟空间的,但是右值只是存在于CPU或者寄存器中 我们可以看到,左值加const可以引用右值,右值不能直接引用左值,需要调用move函数,move函数相当于将左值强制转化为右值,才能引用