如果我想創建一個在從基類繼承的層次結構派生類成員函數shared_ptr<Derived>
,我可以使用shared_from_this
和static_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
不是做同樣的事情嗎?有沒有辦法讓我編寫上面的代碼,不涉及不必要的引用操作?
是的,所有這些指針應該使用通用引用... http://en.cppreference.com/w/cpp/memory/shared_ptr/pointer_cast委員會的嚴肅監督。 – Deduplicator 2014-12-10 22:04:51
@Deduplicator:順便說一句,新術語可能是「轉發參考」(參見Herb Sutter的CppCon 2014的一些視頻) – 2014-12-10 22:20:39