Date: Sun, 12 Jul 2020 21:42:40 -0400
Copy, or copy not; there is no shallow.
-- Yoda
Sent from my BlackBerry portable Babbage Device
Original Message
From: Hans Åberg via Std-Discussion
Sent: Friday, July 10, 2020 12:44 PM
To: Ville Voutilainen
Reply To: std-discussion_at_[hidden]
Cc: Hans Åberg; Kyle Knoepfel; std-discussion_at_[hidden]
Subject: Re: [std-discussion] std::make_shared and type deduction
> 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.
-- Yoda
Sent from my BlackBerry portable Babbage Device
Original Message
From: Hans Åberg via Std-Discussion
Sent: Friday, July 10, 2020 12:44 PM
To: Ville Voutilainen
Reply To: std-discussion_at_[hidden]
Cc: Hans Åberg; Kyle Knoepfel; std-discussion_at_[hidden]
Subject: Re: [std-discussion] std::make_shared and type deduction
> 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 mailing list Std-Discussion_at_[hidden] https://lists.isocpp.org/mailman/listinfo.cgi/std-discussion
Received on 2020-07-12 20:45:57