swap 函数应该调用 swap,而不是 std::swap
void swap(Foo &lhs, Foo &rhs) {
// 错误,这个函数使用了标准库版本的 swap,而不是 HasPtr 版本
std::swap(lhs.h, rhs.h);
}
正确的 swap 函数
void swap(Foo &lhs, Foo &rhs) {
using std::swap;
swap(lhs.h, rhs.h);
}
在赋值运算符中使用 swap
使用拷贝和交换的赋值运算符自动就是异常安全的,且能正确处理自动赋值
// 注意 rhs 是按值传递的,意味着 HasPtr 的拷贝构造函数将右侧运算对象中的 string 拷贝到 rhs
HasPtr& HasPtr::operator=(HasPtr rhs) {
// 交换左侧运算对象和局部变量 rhs 的内容
swap(*this, rhs);
return *this;
}