|
Boost : |
Subject: Re: [boost] Question about the weak_ptr constructor with lock() call
From: Andrey Semashev (andrey.semashev_at_[hidden])
Date: 2016-04-20 14:49:27
On 2016-04-20 21:00, Peter Dimov wrote:
> He-Jie Shih wrote:
>> Hi all,
>>
>> I have question about this line:
>> https://github.com/boostorg/smart_ptr/blob/develop/include/boost/smart_ptr/weak_ptr.hpp#L67
>>
>>
>> I still can't understand the sentence:
>> // r.px may already have been invalidated. The px(r.px)
>> // conversion may require access to *r.px (virtual inheritance).
>>
>> The px is just a scalar. Why assigning the scalar will require the
>> de-reference operator? The comment says it's in virtual inheritance,
>> but I still have not idea about it.
>
> When a class Y derives virtually from X, Y contains a hidden pointer of
> type X* to its X base (because the offset of the X subobject is not
> constant). When you assign Y* to X*, the compiler reads the hidden
> pointer of the Y object. If the Y object is invalid, this usually crashes.
Maybe the cheaper (and arguably more common) version could be used when
it is known that the virtual inheritance is not in play? The case could
be detected with is_virtual_base_of from TypeTraits.
Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk