我有一個關於使用unique-ptrs的問題。我得到this answer建議使用移動對象。我定義如下的一類:在C++ 11中定義移動對象是否有意義?
class B {
const string objName;
public:
B (B &&) = default;
B & operator= (B &&) = default;
B (const B &) = delete;
B & operator= (const B &) = delete;
B(const string & name) :
objName(name) {
}
virtual ~B();
const string name() const { return objName;};
}
,我這個線叫B:
class A {
A(){}
void take(B b);
}
A a;
B b("test");
cout<<b.name();
a.take(std::move(b));
cout<<b.name();
我的問題:
- 即使我已經拖欠了移動構造函數,我不能寫a.take(b),我正在編譯錯誤。 (b)
- 在結果中,「測試」結果顯示「複製構造函數」被刪除,但似乎合乎邏輯的選擇是使用移動構造函數,而不需要寫入std :: move打印兩次。爲什麼在調用move之後b對象沒有被移除?如果b對象仍然存在並且它的一個副本已經發送給a.take(move(b)),那麼這意味着我們沒有任何用於右值對象的移動。
- 是否使用上述移動對象(刪除複製構造函數和賦值運算符以及默認移動構造函數和移動賦值)是否是一種很好的做法?
嘗試用更長的字符串替換「test」,看看會發生什麼。一般而言,移動對象的值是不確定的;它可能是舊的價值或不是。 –
如果你想從它移動,你需要從'objName'中移除'const'。 –
@AlanStokes刪除const會導致測試將被打印一次。這是否意味着永恆的記憶永遠不會被移動?或者他們會被複制? – Govan