我试图理解弱指针成员(使用visual studio 2013 C ++编译器)
mutable weak_ptr<_Ty> _Wptr
当从派生自它的对象创建enable_shared_from_this
时,模板类std::shared_ptr<_Ty>
中的被初始化。为此,我从一个使用模板函数std::shared_ptr<_Ty>
std::make_share<_Ty>
的简单代码中跟踪代码。
我发现当编译器在基类_Wptr
中调用方法_Enable_shared
时,_Ref_count_del_alloc
的初始化就会继续。
现在为此目的定义了2个模板方法。当_Ty
类派生自enable_shared_from_this
时,定义了一种方法。这是方法:
template<class _Ty>
inline void _Enable_shared(_Ty *_Ptr, _Ref_count_base *_Refptr,
typename _Ty::_EStype * = 0)
{ // reset internal weak pointer
if (_Ptr)
_Do_enable(_Ptr,
(enable_shared_from_this<typename _Ty::_EStype>*)_Ptr, _Refptr);
}
第二种方法是在_Ty
类不派生自enable_shared_from_this
时定义的。这是方法:
inline void _Enable_shared(const volatile void *, const volatile void *)
{
// not derived from enable_shared_from_this; do nothing
}
我遇到的问题是C ++编译器如何解析使用哪种方法?除此之外,我希望在编译时实例化这两个方法,如果类不是从enable_shared_from_this
派生的,那么会产生编译错误。然而,编译器似乎只选择一种方法来实例化和适当的方法。
答案 0 :(得分:1)
在深入研究代码之后,我发现理解这是如何完成的关键点是通过Kerry SB指出的函数模板专业化。由于_EStype
仅在enable_shared_from_this
基本模板类中定义,因此编译器能够根据参数中较不合理的调用在_Enable_shared
函数模板之间进行选择。
Herb Sutter的以下文章对此进行了详细解释: