Boost logo

Boost :

From: Gavin Lambert (boost_at_[hidden])
Date: 2020-01-29 05:55:22


On 29/01/2020 18:39, Glen Fernandes wrote:
>> A std::unique_ptr<T[], D> stores a D::pointer.
>>
>> In our case, D is alloc_deleter<T[], A> and its ::pointer is an
>> alloc_ptr<T[], Allocator>.
>>
>> This alloc_ptr<T[], Allocator> stores an A::pointer and a size_t.
>>
>>> This seems incompatible with what you're saying above.
>>
>> It isn't.
>>
>> > (There is also no mention of ptr() or size() there.)
>>
>> It specifies that the ::pointer is an 'unspecified' pointer-like type.
>> I forgot to document that on this unspecified pointer type one can use
>> .ptr() to get the Allocator::pointer and .size() to get the size.
>
> Basically, a unique_ptr result from an allocate_unique<T[]>(a, n)
> _has_ to store the n somewhere in the unique_ptr because it needs to
> know how many objects to destroy and what size storage to deallocate.
>
> I also provide access for you to get that n. (I just forgot to put it
> in the documentation).

Does it also implicitly decay to a T*?

(I did have a look at
https://github.com/boostorg/smart_ptr/blob/master/include/boost/smart_ptr/allocate_unique.hpp
but I don't see any `operator T*`, which is what I'd expect.)

If not, that seems like it'd make it hard to pass to something expecting
a raw pointer (eg. as method argument, or to construct a std::span).

Or unless you know about the extra undocumented .ptr() indirection
requirement.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk