????首先看cppreference的解釋:
std::enable_shared_from_this?allows an object?t?that is currently managed by a?std::shared_ptr?named?pt?to safely generate additional?std::shared_ptr?instances?pt1, pt2, ...?that all share ownership of?t?with?pt.Publicly inheriting from?std::enable_shared_from_this?provides the type?T?with a member function?shared_from_this. If an object?t?of type?T?is managed by a?std::shared_ptr?named?pt, then calling?T::shared_from_this?will return a new?std::shared_ptr?that shares ownership of?t?with?pt
意思就是說,如果一個(gè)T類型的對(duì)象t,是被std::shared_ptr管理的,且類型T繼承自std::enable_shared_from_this,那么T就有個(gè)shared_from_this的成員函數(shù),這個(gè)函數(shù)返回一個(gè)新的std::shared_ptr的對(duì)象,也指向?qū)ο髏。
? ? 那么這個(gè)特性的應(yīng)用場景是什么呢?一個(gè)主要的場景是保證異步回調(diào)函數(shù)中操作的對(duì)象仍然有效。比如有這樣一個(gè)類:

Foo::Bar接受一個(gè)函數(shù)對(duì)象,這個(gè)對(duì)象需要一個(gè)Foo*指針,其實(shí)要的就是Foo::Bar的this指針,但是這個(gè)回調(diào)是異步的,也就是說可能在調(diào)用這個(gè)回調(diào)函數(shù)時(shí),this指向的Foo對(duì)象已經(jīng)提前析構(gòu)了。這時(shí)候,std::enable_shared_from_this就派上用場了。修改后如下:

這樣就可以保證異步回調(diào)時(shí),F(xiàn)oo對(duì)象仍然有效。
? ? 注意到cppreference中說道,必須要是std::shared_ptr管理的對(duì)象,調(diào)用shared_from_this才是有效的,為什么呢?這個(gè)就需要看看std::enable_shared_from_this的實(shí)現(xiàn)原理了:
? ? std::enable_shared_from_this<T> 有一個(gè)std::weak_ptr<T>的成員,實(shí)際上在構(gòu)造std::enable_shared_from_this<T>時(shí),并沒有初始化std::weak_ptr<T>成員,而是在用這個(gè)std::enable_shared_from_this<T>去構(gòu)造std::shared_ptr的時(shí)候,去構(gòu)造并初始化這個(gè)std::weak_ptr<T>成員。所以這也就是為什么cppreference中說的這個(gè)對(duì)象必須是std::shared_ptr管理的,因?yàn)檫@個(gè)對(duì)象不是通過std::shared_ptr來管理,那么std::weak_ptr是未初始化的,無法通過其提升為std::shared_ptr對(duì)象。OK,原理說了,具體實(shí)現(xiàn)可以去看代碼,不了解std::weak_ptr和std::shared_ptr的關(guān)系的,可以看看這篇文章:關(guān)于shared_ptr的幾個(gè)問題