I\'m using enable_shared_from_this
and then inherit from Base
. When trying to use shared_from_this()
in Derived
You cannot call shared_from_this()
in the object's constructor. shared_from_this()
requires that the object is owned by at least one shared_ptr
. An object cannot be owned by a shared_ptr
before it is constructed.
I would guess that the internal weak pointer is set when a shared_ptr
takes ownership of the object for the first time. Before that point, there is no reference count struct that the weak pointer can reference.
Conceptually, shared_from_this()
picks a shared_ptr
pointing to this
and returns a copy of it.
In the constructor, there is no shared_ptr
pointing to this
.
James McNellis's answer is right.
As for the explanation of the enable_shared_from_this
template itself, which as you observe appears to do nothing, note 7 at the bottom of this page explains:
...the template
enable_shared_from_this
holds aweak_ptr
object that points to the derived object. There's a chicken-and-egg problem, though, about how to initialize thatweak_ptr
object when there is no correspondingshared_ptr
object. The implementation trick is that the constructors forshared_ptr
know aboutenable_shared_from_this
, and set theweak_ptr
object during construction of ashared_ptr
object that owns a resource that hasenable_shared_from_this
as a public base class.