关于std::swap 中实现的移动语义

在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中的结果一致。 

但是如果类中没有实现右值引用的移动构造函数,就会出错。

猜你喜欢

转载自blog.csdn.net/znzxc/article/details/81196781