我對 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 洗掉太 100 初始化 12 初始化 10 復制發生:x = 11 洗掉太 10 洗掉太 101 洗掉太 12 洗掉太 11
如您所見,只有 v.try_emplace(12, 12, 13) 不使用復制建構式。v.emplace(100, Too{ 100,23 }) 和 v.try_emplace(11, std::move(t)) 都呼叫復制建構式。
那么即使我使用 std::move(t) 怎么可能呢?
任何建議將不勝感激。
謝謝,
uj5u.com熱心網友回復:
由于您已經為您的類提供了一個復制建構式,因此編譯器不會隱式生成Too::Too(Too&&)移動建構式。
此外,當類沒有可用的移動建構式時,可以使用復制建構式。
要使用移動建構式,您必須顯式提供適當的用戶定義移動建構式Too::Too(Too&&),然后您將獲得所需的結果。
您可以通過添加Too(Too&&) = default;或撰寫自己的移動建構式來添加移動建構式,該建構式將在建構式初始化程式串列中進行初始化。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/475781.html
上一篇:從json檔案加載專案描述
下一篇:從Lst字典創建特定鍵和值的字典
