在swap中,会默认使用对象的右值引用进行移动,如果 没有右值引用,则调用默认拷贝构造函数。
在linux环境下进行验证。
1.类中只定义了左值引用构造函数和拷贝构造函数。
结果如下:
先生成a,b对象,在swap中构建了一个局部变量,然后进行拷贝构造。
2.类中定义了左值引用的构造函数、拷贝构造函数和右值引用的构造函数、移动构造函数。
结果如下:
在生成a,b对象后,swap函数里 先调用了一次右值引用构造函数,由进行了两次移动构造。
所以swap中的可能实现如下:
template<class T>
void swap(T &t1, T &t2)
{
T temp = std::move(t1);
t1 = std::move(t2);
t2 = std::move(temp);
}
3.用自实现的swap进行验证:
结果如下:
和2中的结果一致。
但是如果类中没有实现右值引用的移动构造函数,就会出错。