我对emplace和try_emplace有一个问题,因为它们在移动对象时总是使用复制构造函数。
#include <iostream>
#include <unordered_map>
#include <map>
using namespace std;
class Too {
public:
Too(int x, int y):x_(x), y_(y) {
cout << "init " << x_ << endl;
}
Too(const Too& too):x_(too.x_+1), y_(too.y_+1) {
cout << "Copy happen: x = " << x_ << endl;
}
~Too() {
cout << "delete too " << x_ << endl;
}
private:
int x_, y_;
};
std::map<int, Too> v;
int main()
{
v.emplace(100, Too{ 100,23 });
v.try_emplace(12, 12, 13);
Too t = Too(10, 11);
v.try_emplace(11, std::move(t));
}
输出初始化100复制发生:x = 101删除too 100init 12init 10复制发生:x = 11删除too 10删除too 101删除too 12删除too 11
可以看到,只有v.try_emplace(12,12,13)没有使用复制构造函数。v.t emplace(100, Too{100,23})和v.t y_emplace(11, std::move(t))都调用复制构造函数。
那么,当我使用std::move(t)时,它是怎么做到的呢?
任何建议都是非常感谢的。
谢谢,
既然已经为类提供了复制构造函数,那么移动构造函数Too::Too(Too&&)
将不会由编译器隐式生成.
而且,当一个类没有移动构造函数可用时,可以使用复制构造函数。
要使用移动构造函数,您必须显式地提供适当的用户定义移动构造函数Too::Too(Too&&)
,然后您将获得所需的结果。
你可以通过添加Too(Too&&) = default;
或编写自己的移动构造函数来添加移动构造函数,移动构造函数将在构造函数初始化列表中进行初始化。