这一部分主要介绍左值,右值,引用,拷贝和移动.这些可以说是C++11显著区别于以前的C++(还有C)的特性.本文主要从易用的角度介绍值类型(值类型实际要更多一些).
经验谈: 除非"移动"能带来特别明显的性能优势,所有"支持拷贝的自定义类"都应该把移动操作设为
=delete
的.一方面并不是所有人都熟悉移动语义,另一方面,移动语义可能会引入许多bug. 综上,要么类实例是只能拷贝的,要么是只能移动的.
拷贝与移动的基本定义
- "拷贝"和"移动"是从逻辑层面定义的,物理层面只有"拷贝",没有"移动"操作.
-
对于自定义类,拷贝与移动的实现有基本的准则(非硬性),这些准则是:
- 拷贝:不应对源对象做任何修改.
- 移动:可以对源对象做修改,但是源对象被修改后必须可以被赋值,且可以安全的析构.
- 注意,对于移动操作.我们不能对移出后剩余的部分做任何假定,在没有重新赋值前,不能使用剩下的对象
- 例如:对一个
vector<int> a;
,其中的所有元素都被移出后,不能假定a.size()
值为0了.
- 例如:对一个
- 一般而言:
- 对于涉及资源的类型(如vector),我们一般认为,移动操作的性能开销应该优于拷贝.