This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
Re: [GSoC] __enable_shared_from_this_helper
- From: Tim Shen <timshen at google dot com>
- To: Fan You <youfan dot noey at gmail dot com>
- Cc: Jonathan Wakely <jwakely at redhat dot com>, Tim Shen <timshen91 at gmail dot com>, "libstdc++" <libstdc++ at gcc dot gnu dot org>
- Date: Sun, 3 May 2015 19:17:57 -0700
- Subject: Re: [GSoC] __enable_shared_from_this_helper
- Authentication-results: sourceware.org; auth=none
- References: <CALvpekGVZEMtGN5MKVXrArG5cKJhqDQjsfgjdFZYk0=H=7+V_Q at mail dot gmail dot com> <20150428215024 dot GF3618 at redhat dot com> <20150428215349 dot GG3618 at redhat dot com> <CALvpekGhEJfEWdHmtOyco-Ua=sPjk4yhpFFE7Fzffy9cTmnVbA at mail dot gmail dot com> <CAG4ZjN=a9nvQ3CgqRiSze-fbUvh0u69WQQdehS5+mFXsvtSP=A at mail dot gmail dot com> <20150429100344 dot GH3618 at redhat dot com> <CAG4ZjNnFTOtEoSPdzv9Dip8s7O6o4ToL2+N-j_oEuxvrD1spLA at mail dot gmail dot com> <20150430112352 dot GR3618 at redhat dot com> <CAG4ZjNmgtF-7jE17d=e8fK_iMhkDHT783Qv1sYpt6MPKsmLL=A at mail dot gmail dot com> <20150430174827 dot GU3618 at redhat dot com> <CALvpekGSvSvg=WcF4w2r3LQ377azPfsAKfLtA5pFm3OKz6DesA at mail dot gmail dot com> <CAG4ZjNmAeB_CvR_4HXO7y3=FxcsTfAXi95RxeH=c8ngfTic5vA at mail dot gmail dot com> <CALvpekF+Y1C+EgevdyEzgt++OEUz4iyjCdTnA6Ny5Ak=b88HTg at mail dot gmail dot com> <CAG4ZjNktcN84WzhTMx-N7SDCG6DYdcH-P6FwnExd-gjp-RH3RQ at mail dot gmail dot com> <CALvpekEmg5f38iXpkNuaXmU0TNJboJSUAEEMo9Qpe4GrFhaTUw at mail dot gmail dot com> <CAG4ZjNmhovdYMH+jXxFqjaJEHFxed1rg3BtCyecGxX-xsMuWLQ at mail dot gmail dot com>
On Sun, May 3, 2015 at 4:47 PM, Tim Shen <timshen@google.com> wrote:
> On Sun, May 3, 2015 at 4:03 PM, Fan You <youfan.noey@gmail.com> wrote:
>> Follow up questions:
>>
>>> > According to my knowledge, __enable_shared_from_this construct a
>>> > weak_ptr in order to safely instantiate a new shared_ptr use only this
>>> > pointer. So, does __enable_shared_from_this_helper has no effect until
>>> > user trying to do something like this?
>>> >
>>> >> class Test : public ___enable_shared_from_this { };
>>> >>
>>> >> shared_ptr<Test> (new Test());
>>>
>>> Correct.
>>> It ensures that when an object is owned by a shared_ptr, the weak_ptr
>>> member shares ownership with that shared_ptr.
>>
>> However,
>>
>> ctor of __shared_count only pass the same type of pointer into
>>
>>> __enable_shared_from_this_helper(_M_refcount, __p, __p);
>>
>>
>> but __enable_shared_from_this_helper take two different types of ptr.
>>
>>> (__shared_count&, __enable_shared_from_this* ptr1, _Tp1* ptr2)
>>
>> Can you give any specific example of using this feature ?
>>
>
> You are looking at the wrong overloading. There're three overloadings declared:
>
Sorry, I take this back :)
For this example:
struct A : std::enable_shared_from_this<A> { };
int main() { std::shared_ptr<A> a(new A()); }
`__enable_shared_from_this_helper(_M_refcount, __p, __p)` matches:
> // Friend of enable_shared_from_this.
> template<typename _Tp1, typename _Tp2>
> void
> __enable_shared_from_this_helper(const __shared_count<>&,
> const enable_shared_from_this<_Tp1>*,
> const _Tp2*) noexcept;
instead of
> template<_Lock_policy _Lp>
> inline void
> __enable_shared_from_this_helper(const __shared_count<_Lp>&, ...) noexcept
> { }
>
Notice that the real function body of the matched function is defined
in std::enable_shared_from_this in shared_ptr.h.
--
Regards,
Tim Shen