如何正确地实现移动构造函数?
自己实现一个pair,名为my_pair,分别写了两个构造函数(原为复制/移动构造函数,错)。通过两个变量,调用的是move版本的构造函数,但是变量是左值,不应该是const引用版本的构造函数吗?
完整代码:Ubuntu Pastebin
两个构造函数代码如下:
template<typename K1, typename K2>
my_pair(const K1& f, const K2& s) :first(f), second(s) {
std::cout << "my_pair(const K1&, const K2&)" << std::endl;
}
template<typename K1, typename K2>
my_pair(K1&& f, K2&& s) : first(f), second(s) {
std::cout << "my_pair(K1&&, K2&&)" << std::endl;
}
//调用
int i=1;
string str="C++";
my_pair<int, string> mp(i,str);
//输出
my_pair(K1&&, K2&&)
修改如下:
class student
{
public:
student(const char* name,int size)
{
_name = new char[size];
strncpy_s(_name,size,name,MaxNameSize);
}
/*手动实现的拷贝构造函数
*实现了按值拷贝的深拷贝
*/
student(const student& ref)
{
int len = strnlen_s(ref._name, MaxNameSize);
int maxCount = len == MaxNameSize ? len : len+1;
_name = new char[maxCount];
strncpy_s(_name, maxCount, ref._name, maxCount);
}
//赋值函数自己添加
//这是移动构造函数
student(student&& rref)
{
_name = rref._name;
rref.name = nullptr;
}
//移动赋值自己添加一下
~student()
{
delete _name;
_name = nullptr;
}
private:
char* _name;
static constexpr int MaxNameSize = 64;
};