2014-12-10 58 views
6

如果我想創建一個在從基類繼承的層次結構派生類成員函數shared_ptr<Derived>,我可以使用shared_from_thisstatic_pointer_cast如何在派生類中使用shared_from_this而沒有多餘的RC操作?

class Base: public std::enable_shared_from_this<Base> { 
}; 

class Der: public Base { 
public: 
    std::shared_ptr<Der> make_SP_to_Me() 
    { return std::static_pointer_cast<Der>(shared_from_this()); } 
}; 

我擔心的是static_pointer_cast通過lvalue-接受它的參數ref-to-const,所以當創建新的shared_ptr<Der>時,控制塊中的引用計數會增加。當從shared_from_this返回的shared_ptr<Base>被銷燬時,控制塊中的引用計數將再次遞減。我很驚訝地發現,沒有static_pointer_cast超載取得一個右值,可以避免在控制塊中操作refcount。

shared_ptr<T>有一個模板化的構造函數,它執行shared_ptr<U>類型的右值來執行移動操作,從而避免需要進行引用操作。 static_pointer_cast不是做同樣的事情嗎?有沒有辦法讓我編寫上面的代碼,不涉及不必要的引用操作?

+2

是的,所有這些指針應該使用通用引用... http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast委員會的嚴肅監督。 – Deduplicator 2014-12-10 22:04:51

+0

@Deduplicator:順便說一句,新術語可能是「轉發參考」(參見Herb Sutter的CppCon 2014的一些視頻) – 2014-12-10 22:20:39

回答

1

看起來你將不得不依賴於返回值優化,並希望它足夠聰明來幫助你。

如果std::*_pointer_cast有重載接受轉發引用(T&&),那麼他們可以從臨時轉讓所有權,這不會是一個問題。自從C++ 11以來,我認爲這是圖書館的疏忽。

相關問題