c++ 默认移动构造函数什么时候会自动生成以及它内部实现

一、默认移动构造函数什么时候会自动生成?

如果需要用一个右值去拷贝构造一个类对象或赋值给一个类对象,则在该类自定义了移动构造函数/移动赋值函数的情况下,会调用该类自定义的移动构造函数/移动赋值函数

而在没有自定义移动构造函数/移动赋值函数的情况下,如果该类自定义了拷贝构造函数/赋值运算符或析构函数之一,都只会调用拷贝构造函数/赋值运算符(前提是形参为const T&而不是T&,因为const T&可以兼容右值实参,而T&不能)而不会生成默认移动构造函数。注意即使没有自定义拷贝构造函数/赋值运算符,只自定义了析构函数,也不会生成默认移动构造函数,这是因为自定义析构函数表明该类在析构时可能需要回收内存,如果生成了默认移动构造函数可能会出错(比如同一地址被释放两次的错误)

二、默认移动构造函数内部实现

当成员类型有移动构造函数时,会调用该成员的移动构造函数,否则调用默认拷贝构造函数。

#include
#include
#include

using std::cin;
using std::cout;
using std::endl;
using std::string;

class A
{
public:
	int *p = new int;
	string str = "Hello";
};

int main()
{
	A a;
	A b(std::move(a));  //std::move语句可以将左值变为右值而避免拷贝构造。该语句使用默认移动构造函数构造
	cout << a.p << " " << a.str << " "<

在a的资源转移给b后,a.p并没有变成nullptr,a.str变成了空串。这是因为默认移动构造函数对int*类型成员只进行简单复制,对于string类型成员调用了其默认移动构造函数进行真正的移动

参考:

c++ 默认移动构造函数_杳杳星河的博客-CSDN博客

C++默认移动构造函数有什么用? - 知乎 (zhihu.com)

详解C++移动语义std::move()_子木呀的博客-CSDN博客

你可能感兴趣的:(C++,c++,开发语言)