这意味着隐式移动构造函数将成员级移动和隐式移动赋值运算符进行成员级分配是什么?
来自https://en.cppreference.com/w/cpp/language/move_constructor:
对于非联合类类型(类和结构),移动构造函数执行对象的完整成员移动,并且是非静态的成员,按照其初始化顺序,使用直接初始化带有xvalue参数。如果满足以下条件constexpr构造函数,生成的move构造函数为constexpr。
来自https://en.cppreference.com/w/cpp/language/move_assignment:
对于非工会的类类型(类和结构),移动分配操作员执行对象的完整成员移动分配直接基地和直接非静态成员在其声明中顺序,对标量使用内置分配,按成员数组的移动分配,类的移动分配运算符类型(称为非虚拟类型)。
以下示例类模板的隐式成员看起来像这样:
template<class T>
class Holder {
public:
Holder(int size) : m_size(size) { m_data = new T[m_size]; }
Holder(Holder && other) :
m_size(std::move(other.m_size)),
m_data(std::move(other.m_data))
{}
Holder& operator=(Holder && other) {
if(this == &other) return *this;
m_data = std::move(other.m_data);
m_size = std::move(other.m_size);
return *this;
}
~Holder() { delete [] m_data; }
private:
T* m_data;
int m_size;
};
此外,以上示例中的std::move()
将传输什么资源?
如果您在链接页面下进一步查看,您会看到类编译器生成的move构造函数(和move赋值运算符)实际上将是Trivial:
小举动作构造函数
如果满足以下所有条件,则类T的move构造函数很简单:
...
...
一个简单的移动构造函数是执行与简单的复制构造函数相同的操作的函数,即,像std :: memmove一样复制对象表示形式。所有与C语言兼容的数据类型(POD类型)都是微不足道的。
((强调我的,也删除了一些段落文本。)
由此,您可以看到实际上默认的move构造函数将复制两个元素。如评论中所述,这将导致您的指针和UB双重删除。