这个问题在这里已有答案:
我正在练习每次通过传递R值来执行移动构造函数。但有时深度拷贝构造函数被调用它不被支持。
我在向量中插入一个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构造函数,它将避免深度复制
解决了它添加NOEXCEPT解决了这个问题
example(example &&source) noexcept :pointer{source.pointer} {
source.pointer = nullptr;
cout << "object moved"<<endl;
}