我正在练习每次通过传递R-Value来执行move构造函数。但是有时会调用Deep Deep构造函数,而不应该这样做。
我正在将R值对象插入向量中。这段代码的逻辑缺陷是什么?
我已经尝试调试,但是我不明白为什么在对象移动后调用了深拷贝构造函数?
#include <iostream>
#include <string>
#include <vector>
using namespace std;
class example{
private:
int *pointer;
public:
//constructor
example(int d){
pointer = new int;
*pointer = d;
cout<<"Constructor Called"<<endl;
}
// deep copy
example(const example &source){
pointer = new int;
*pointer= *source.pointer;
cout<<"deep copy made"<<endl;
}
// Move Constructor
example(example &&source):pointer{source.pointer}{
source.pointer = nullptr;
cout << "object moved"<<endl;
}
~example() {
delete pointer;
cout << "Destroyed"<<endl;
}
};
int main()
{
vector <example> vec;
vec.push_back(example{300});
vec.push_back(example{300});
vec.push_back(example{300});
vec.push_back(example{300});
return 0;
}
如果代码正确,它将始终使用MOVE构造函数,并且将避免深层复制
答案 0 :(得分:2)
通过添加NOEXCEPT解决了该问题
example(example &&source) noexcept :pointer{source.pointer} {
source.pointer = nullptr;
cout << "object moved"<<endl;
}