###C++ Primer第5版 学习笔记
####第十三章
- 拷贝构造函数可以有自身引用以外的参数,不过必须有默认值
- 拷贝构造函数经常被隐式使用,一般不应该是 explicit 的
- 调用标准库容器的 insert 和 push 使用拷贝初始化, emplace 使用直接初始化
- 赋值运算符应返回左侧对象的引用,且正确处理自赋值
=default
显示要求编译器生成合成的函数,=delete
将函数定义为删除的函数来阻止该操作- 析构函数不能 =delete
- 使用 swap 函数时,如果参数类型定义了自己的 swap 函数,则会使用该成员函数,否则使用 std::swap,因此直接写 swap 而不是 std::swap()
- 定义 swap 的类可使用 swap 定义赋值运算符,这叫拷贝并交换.(形参非引用,左值与该副本交换,可以保证异常安全)
- 移后源对象处于有效,可析构可被赋值的状态,但不能对其值做任何假设
- 使用 move 时,使用 std::move,可以避免潜在的名字冲突
- 标准库容器,string,和shared_ptr 既支持移动也支持拷贝,IO 类和 unique_ptr 只可以移动
- 容器类为保证 insert,push 等操作异常安全,不会使用没有标明 noexcept的移动构造函数,因此要想让容器类使用,则需根据情况注明
- 只有当一个类没有定义任何拷贝控制成员,且类的每个非 static 成员都可以移动时,编译器才会为其合成移动构造函数和运算符
- 定义了一个移动构造函数或运算符的类也必须定义自己的拷贝操作,否则会被默认定义为删除的
make_move_iterator
将一个普通迭代器转换为移动迭代器,只有当我们确认源对象不再使用时,才能使用其移动迭代器- 同时接受右值和左值的函数一般可重载为
const T&
和T &&
- 为了防止对左值赋值,通过引用限定符指出只允许 this 可指向左值或右值,引用限定符需同时出现在声明和定义中,位于声明最后或定义的块语句之前
- 如果一个成员函数有引用限定符,同参数列表的所有版本都必须有引用限定符