C++11为什么引入右值?
C++11引入了一个扩展内存的方法——移动而非拷贝,移动较之拷贝有两个优点:
- 效率更高: 在此之前,当数据结构申请的内存用尽时,一般是申请一块更大的内存,然后将旧内存中存储的元素拷贝到新内存中。但很多情况下,为了方便拷贝操作而建立的临时对象在拷贝完成后就被销毁了,因此不如直接将旧内存中的元素移动到新内存中,即省空间(临时对象也是要占内存的),还省时间(不用建立临时对象了)。
IO
、unique_ptr
这样的类都包含不可被共享的资源(如指针或IO缓冲),因此,这些类不支持拷贝,仅支持移动。
PS:STL
和 shared_ptr
既支持移动也支持拷贝。
而为了支持移动操作,就诞生了一种新的引用类型——右值引用(rvalue reference)。
为了与左值引用进行划分,使用 &
时则代表是左值引用,而使用 &&
则代表右值引用。
右值引用有一个重要的特性——只能绑定到一个将要销毁的对象。