Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 移动自定义容器的构造函数?_C++_C++11_Move Semantics_Rvalue Reference - Fatal编程技术网

C++ 移动自定义容器的构造函数?

C++ 移动自定义容器的构造函数?,c++,c++11,move-semantics,rvalue-reference,C++,C++11,Move Semantics,Rvalue Reference,持有动态分配数组的类的移动构造函数是否应该删除它?例如,我有: template<typename T> class MyVector { public: MyVector() { data = new T[32]; capacity = 32; size = 0; } MyVector(const MyVector<T>& o) //The basic copy constructor { capacity = o.capacity; size = o.siz

持有动态分配数组的类的移动构造函数是否应该删除它?例如,我有:

template<typename T>
class MyVector
{
public:
MyVector()
{
data = new T[32];
capacity = 32;
size = 0;
}

MyVector(const MyVector<T>& o) //The basic copy constructor
{
capacity = o.capacity;
size = o.size;
data = new T[capacity];

for(int i = 0; i < _size; i++)
{
data[i] = o.data[i];
}
}

MyVector(const MyVector<T>&& o) //The move constructor
{
//What goes here?
}

private:
T* data;
unsigned int size;
unsigned int capacity;
};
模板
类MyVector
{
公众:
MyVector()
{
数据=新的T[32];
容量=32;
尺寸=0;
}
MyVector(const MyVector&o)//基本复制构造函数
{
容量=o.容量;
尺寸=o.尺寸;
数据=新T[容量];
对于(int i=0;i<\u size;i++)
{
数据[i]=o.data[i];
}
}
MyVector(const MyVector&&o)//移动构造函数
{
//这里有什么?
}
私人:
T*数据;
无符号整数大小;
无符号整数容量;
};
我知道在执行以下操作时会调用移动构造函数:

MyVector A; A=MyVector()//右边的那个得到了一个移动构造函数,叫做? 那么它应该与复制构造函数相同吗

持有动态分配数组的类的移动构造函数是否应该删除它?例如,我有:

template<typename T>
class MyVector
{
public:
MyVector()
{
data = new T[32];
capacity = 32;
size = 0;
}

MyVector(const MyVector<T>& o) //The basic copy constructor
{
capacity = o.capacity;
size = o.size;
data = new T[capacity];

for(int i = 0; i < _size; i++)
{
data[i] = o.data[i];
}
}

MyVector(const MyVector<T>&& o) //The move constructor
{
//What goes here?
}

private:
T* data;
unsigned int size;
unsigned int capacity;
};
没有要删除的内容。毕竟,这个对象正在构造中。它所要做的就是从RHS上的对象获取资源。它应使RHS处于合理状态。比如说,

MyVector(MyVector<T>&& o)
{
    data = o.data;
    o.data = nullptr;

    capacity = o.capacity;
    o.capacity = 0;

    size = o.size;
    o.size = 0;
}
MyVector(MyVector&&o)
{
data=o.data;
o、 数据=空PTR;
容量=o.容量;
o、 容量=0;
尺寸=o.尺寸;
o、 尺寸=0;
}

请注意,为了使移动构造函数工作,参数不能是
const
。移动构造函数修改其参数。

噢,是这样的:MyVector(const MyVector&&o)//移动构造函数{data=o.data;size=o.size;capacity=o.capacity;o.data=null;o.capacity=null;o.size=null;}@shorth\radeon我添加了一个例子。应该尊重类型的不变量,因此您需要对
大小
容量
做些什么。噢,非常感谢,现在我明白了!所以我用了另一种方法,它被调用到左侧,从右侧对象中窃取数据。@shorth\u radeon是的,RHS是临时的,它绑定到一个
&&
,这意味着移动重载被拾取。正确地实现移动语义取决于您:-)这可能只是一个一次性练习,但是您的
向量
无法处理没有默认构造函数的类型。实向量在创建时不会创建32个新的
t
s;它们为32个
T
s分配足够的内存,然后根据需要通过放置新的对象来分配该内存。