提问人:Narayan Poudel 提问时间:5/12/2022 更新时间:5/12/2022 访问量:79
尽管我提供了移动构造函数,但仍调用了复制构造函数
Copy constructor is called although I have provided the move constructor
问:
我已经实现了复制构造函数和移动构造函数,我学到的是程序必须使用 Move 构造函数而不是复制构造函数。
class Move
{
private:
int *data; // raw pointer
public:
Move(int); // constructor
Move(const Move &source); // copy constructor
Move(Move &&source); // Move Constructor
~Move();
};
Move::Move(int d)
{
data = new int;
*data = d;
cout << "Constructor for: " << d << endl;
}
Move::Move(const Move &source)
: Move(*source.data)
{
cout << "Copy constructor -deep copy for: " << *data << endl;
}
Move::Move(Move &&source)
: data{source.data}
{
source.data = nullptr;
cout << "Move constructor -Moving resource: " << *data << endl;
}
Move::~Move()
{
if (data != nullptr)
{
cout << "Destructor freeing data for : " << *data << endl;
}
else
{
cout << "Destructor freeing data for nullptr" << endl;
}
delete data;
}
//driving function
int main()
{
vector<Move> vec;
vec.push_back(Move{10});
vec.push_back(Move{20});
vec.push_back(Move{30});
vec.push_back(Move{40});
vec.push_back(Move{50});
vec.push_back(Move{60});
vec.push_back(Move{70});
return 0;
}
输出:
构造函数: 10
Move 构造函数 -Moving resource: 10
析构函数释放 nullptr 的数据
构造函数: 20
Move 构造函数 -Moving resource: 20
构造函数: 10
复制构造函数 -deep copy for: 10
析构函数释放数据 : 10
析构函数释放 nullptr 的数据
构造函数: 30
Move 构造函数 -Moving resource: 30
构造函数: 10
复制构造函数 -deep copy for: 10
构造函数: 20
复制构造函数 -deep copy for: 20
析构函数释放数据 : 10
析构函数释放数据 : 20
析构函数释放 nullptr 的数据
构造函数: 40
Move 构造函数 -Moving resource: 40
析构函数释放 nullptr 的数据
构造函数: 50
Move 构造函数 -Moving resource: 50
构造函数: 10
复制构造函数 -deep copy for: 10
构造函数: 20
复制构造函数 -deep copy for: 20
构造函数: 30
复制构造函数 -deep copy for: 30
构造函数: 40
复制构造函数 -deep copy for: 40
析构函数释放数据 : 10
析构函数释放数据 : 20
析构函数释放数据 : 30
析构函数释放数据 : 40
析构函数释放 nullptr 的数据
构造函数: 60
Move 构造函数 -Moving resource: 60
析构函数释放 nullptr 的数据
构造函数: 70
Move 构造函数 -Moving resource: 70
析构函数释放 nullptr 的数据
析构函数释放数据 : 10
析构函数释放数据 : 20
析构函数释放数据 : 30
析构函数释放数据 : 40
析构函数释放数据 : 50
析构函数释放数据 : 60
析构函数释放数据 : 70
答:
因为 std::vector 仅在您具有 noexcept 移动构造函数时才会在调整大小时移动。
或者,您可以致电以避免调整大小。vec.reserve(7)
下一个:如何禁用从派生类移动构造基类?
评论