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_thisholds aweak_ptrobject that points to the derived object. There's a chicken-and-egg problem, though, about how to initialize thatweak_ptrobject when there is no correspondingshared_ptrobject. The implementation trick is that the constructors forshared_ptrknow aboutenable_shared_from_this, and set theweak_ptrobject during construction of ashared_ptrobject that owns a resource that hasenable_shared_from_thisas a public base class.