Come std :: enable_shared_from_this :: shared_from_this funziona

Non riesco a capire come std::enable_shared_from_this::shared_from_this restituisce un pinter condiviso che condivide la proprietà con il puntatore esistente. In altre parole, fai questo :

 std::shared_ptr getFoo() { return shared_from_this(); } 

Quindi quando chiami getFoo come fa esattamente ciò che è l’altro shared_ptr a condividere la proprietà con e non a creare un shared_ptr separato che possiede lo stesso this .

Ho bisogno di capire questo per essere in grado di capire come creare shared_ptr da alcuni oggetti che aumentano tutti lo stesso conteggio ref e non inizializzano separate shared_ptr s.

enable_shared_from_this ha un membro dei dati weak_ptr . Il shared_ptr può rilevare se T è derivato da enable_shared_from_this . Se lo è, il shared_ptr assegnerà *this (che è il shared_ptr ) al membro dei dati enable_shared_from_this in enable_shared_from_this . shared_from_this() può quindi creare un shared_ptr dal weak_ptr .

Esempio di una ansible implementazione:

 template class enable_shared_from_this { protected: constexpr enable_shared_from_this() { } enable_shared_from_this(enable_shared_from_this const&) { } enable_shared_from_this& operator=(enable_shared_from_this const&) { return *this; } public: shared_ptr shared_from_this() { return self_.lock(); } shared_ptr shared_from_this() const { return self_.lock(); } private: weak_ptr self_; friend shared_ptr; }; template shared_ptr::shared_ptr(T* ptr) { // ... // Code that creates control block goes here. // ... // NOTE: This if check is pseudo-code. Won't compile. There's a few // issues not being taken in to account that would make this example // rather noisy. if (is_base_of, T>::value) { enable_shared_from_this& base = *ptr; base.self_ = *this; } }