C++ Logo


Advanced search

Subject: Re: std::make_shared and type deduction
From: Hans Ã…berg (haberg-1_at_[hidden])
Date: 2020-07-10 11:44:17

> On 10 Jul 2020, at 18:27, Ville Voutilainen <ville.voutilainen_at_[hidden]> wrote:
> On Fri, 10 Jul 2020 at 19:26, Hans Ã…berg via Std-Discussion
> <std-discussion_at_[hidden]> wrote:
>>> On 10 Jul 2020, at 15:31, Kyle Knoepfel via Std-Discussion <std-discussion_at_[hidden]> wrote:
>>>> I wasn't. I was pointing out that you're creating a new object. So maybe what
>>>> you want is clone_unique() and clone_shared() with perfect forwarding.
>>> Yes, well done--clone_unique() and clone_shared() are good names. Question is would such facilities have enough interest to justify a proposal? I'm kind of doubtful....
>> One can have polymorphic copy and move operators, by adding to every class A:
>> virtual A* new_p() const& { return new A(*this); }
>> virtual A* new_p() && { return new A(std::move(*this)); }
>> Perhaps the latter would do your job.
> There are things like
> http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2019/p0201r5.html
> that don't require that.

I have identified three types of (virtual) polymorphy, which I use with the Boehm GC: ptr<T>, a pointer that can be a nullptr; ref<T>, a reference which is same as a pointer, but always memory allocated; val<T>, a value which invokes the above polymorphic copy and move operators.

Of these three, I have found that ref<T> is most useful. With ptr<T>, one has to check that the pointer is not null, which is tedious. I have found no use for val<T>, one reason is that classes have other functions that one mostly use, so any actual need for cloning is rare. Then there is also a difference between shallow and deep cloning: Classes typically have other polymorphic pointers that one might want to be followed and cloned as well, which is the deep cloning. If one just applies the operators above, then that is the shallow cloning.

STD-DISCUSSION list run by std-discussion-owner@lists.isocpp.org

Older Archives on Google Groups