假設我有以下代碼:C++的unique_ptr參數
class B { /* */ };
class A {
vector<B*> vb;
public:
void add(B* b) { vb.push_back(b); }
};
int main() {
A a;
B* b(new B());
a.add(b);
}
假設在這種情況下,所有的原始指針B*
可以通過unique_ptr<B>
處理。
令人驚訝的是,我無法找到如何使用unique_ptr
轉換此代碼。試了幾次後,我想出了下面的代碼,它編譯:
class A {
vector<unique_ptr<B>> vb;
public:
void add(unique_ptr<B> b) { vb.push_back(move(b)); }
};
int main() {
A a;
unique_ptr<B> b(new B());
a.add(move(b));
}
所以我簡單的問題:這是做到這一點,特別是方式,是move(b)
做到這一點的唯一途徑? (我正在考慮右值引用,但我沒有完全理解它們。)
如果你有一個鏈接和移動語義的完整解釋,unique_ptr
等,我沒有找到,請不要猶豫分享它。
編輯根據http://thbecker.net/articles/rvalue_references/section_01.html,我的代碼似乎沒問題。
實際上,std :: move只是語法糖。與類X的對象x,作爲move(x)
是一樣的:
static_cast <X&&>(x)
需要這些2移動功能,因爲投射到一個右值參考:
- 防止函數從由值 傳遞「添加」
- 使得
push_back
使用B的默認移動構造函數
顯然,我不需要在第二std::move
我main()
如果我改變我的「添加」功能通過引用(普通左值參考)。
我想這一切一定確認,但...
我認爲這可能對您有用:http:// stackoverflow。com/questions/2876641/so-can-unique-ptr-be-used-safely-in-stl-collections –
@KirilKirov謝謝,這個問題給出了有趣的鏈接(參見編輯) –
你可以避免'std :: move'在主要的情況下,如果你改變了你的add,那會很糟糕,因爲'add'的調用者不知道他們是否仍然擁有這個對象,或者沒有查看'add'的來源。 – Puppy