原文链接: http://jxq.me/2012/06/06/%E8%AF%91%E8%AF%A6%E8%A7%A3c%E5%8F%B3%E5%80%BC%E5%BC%95%E7%94%A8/
对C++11标准中“右值引用”和“move”解释得比较好。
X foo
(
)
;
// foo是一个返回值为X的函数
X x ;
x = foo ( ) ;
X x ;
x = foo ( ) ;
最后一行有如下的操作:
- 销毁x所持有的资源
- 复制foo返回的临时对象所拥有的资源
- 销毁临时对象,释放其资源
上面的过程是可行的,但是更有效率的办法是直接交换x和临时对象中的资源指针,然后让临时对象的析构函数去销毁x原来拥有的资源。换句话说,当赋值操作符的右边是右值的时候,我们希望赋值操作符被定义成下面这样:
// [...]
// swap m_pResource and rhs.m_pResource
// [...]
// swap m_pResource and rhs.m_pResource
// [...]
这就是所谓的move语义。