220 19728 <d50c7d06-70c4-4844-8ac5-d400d653a89e@isocpp.org> article
Path: news.gmane.org!not-for-mail
From: isocppgroup@denisbider.com
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Move destructor draft
Date: Fri, 7 Aug 2015 14:54:27 -0700 (PDT)
Lines: 381
Approved: news@gmane.org
Message-ID: <d50c7d06-70c4-4844-8ac5-d400d653a89e@isocpp.org>
References: <0A99E209-333B-4140-8F65-2F022E681AC1@gmail.com>	<cbaee2cd-b307-4d0b-b72f-ddcd86691c0a@isocpp.org>	<FE9F62B5-D93E-49D8-B7C4-E78519E2A683@gmail.com>	<mpkkel$15i$1@ger.gmane.org>	<a23b1793-1012-46cf-b688-8e893e185b83@isocpp.org>	<EFDF8619-B85A-4C9C-84FC-974ACEBB8370@gmail.com>	<ac96d840-208a-472a-b0b6-712d0ad0d4cc@isocpp.org>	<CAFk2RUbrVj+3uHTSSYL8ipe=4Q=u1Lq47Pn7+aux6Rw-sNhzKQ@mail.gmail.com>	<A1D6E60D-8506-4E5A-A71A-A28B997E973B@gmail.com>	<55C0DDD4.8090100@halpernwightsoftware.com>	<411A67D7-B062-4D22-983A-095737483208@gmail.com>	<55C299B0.1060300@gmail.com>	<55C2ABA3.8060605@halpernwightsoftware.com>	<55C2ECDB.1060307@gmail.com> <CAD6_Qj-QuPRequYbFOL0SqrQSMDh73DbRr7TaqyOX42MZpYXTg@mail.gmail.com> <mpvuub$ekc$1@ger.gmane.org> <5de71605-7320-4130-938b-813304c51069@isocpp.org> <
  mq2f45$k25$1@ger.gmane.org> <dc118bc8-2b00-4e23-b794-75779b15f463@isocpp.org> <mq2l4d$ub0$1@ger.gmane.org> <94331665-f7f3-444b-a1dc-333a52be7873@isocpp.org>
 <mq3857$fc8$1@ger.gmane.org>
 <798f7179-c397-4bad-abeb-1bb7493c9860@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_2548_1499900910.1438984467831"
X-Trace: ger.gmane.org 1438984473 4283 80.91.229.3 (7 Aug 2015 21:54:33 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Fri, 7 Aug 2015 21:54:33 +0000 (UTC)
Cc: mwoehlke.floss@gmail.com, isocppgroup@denisbider.com
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBD5LNK7YQYJRBFGSSSXAKGQEZIPO3GI@isocpp.org Fri Aug 07 23:54:32 2015
Return-path: <std-proposals+bncBD5LNK7YQYJRBFGSSSXAKGQEZIPO3GI@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-pd0-f200.google.com ([209.85.192.200])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBD5LNK7YQYJRBFGSSSXAKGQEZIPO3GI@isocpp.org>)
	id 1ZNpaw-00048L-LX
	for gclcip-std-proposals@m.gmane.org; Fri, 07 Aug 2015 23:54:31 +0200
Original-Received: by pdbpo3 with SMTP id po3sf217638748pdb.1
        for <gclcip-std-proposals@m.gmane.org>; Fri, 07 Aug 2015 14:54:29 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=x-gm-message-state:date:from:to:cc:message-id:in-reply-to
         :references:subject:mime-version:content-type:x-original-sender
         :reply-to:precedence:mailing-list:list-id:x-spam-checked-in-group
         :list-post:list-help:list-archive:list-subscribe:list-unsubscribe;
        bh=UT5JijfU34/D/oLhkbbksIC6nWEwhmfT0zxvyOi8+Ns=;
        b=bten7DTtMU32p9L6Ffunzhj/n7JILaEAmxhsehVvTg5CIrQUHmYYl9RYbJhIblBs4A
         kg2GFRFAZgZuAC9NSC82kb91e7bJ/A8ScKJGFoQ5REVoqOmhDQMdNLOiedkR4uUddF9W
         dR02XT7GMHxmHUBuICsZqTN4O7/yt7XHQtpRr8AICOqdgC5f5VavjCTw09R1iC2VLCop
         Vkr88z16x627IXaZHI2qu+9kZPiRdi/8oA6jmHOFMtzaV0VLkoi/p6WSRPl2IRxXRm5c
         nsmVVHt8DTf5WJs/qlIZiaRJ8QXOGJawUGgbYGG0ZJxgD2EB9UiWWuXydWlXVPOHe4LB
         rA0w==
X-Gm-Message-State: ALoCoQkwDUlM6PpnAuo7KasJIi5HZnNVU+AymsgOMXIALj+ynPNUqW9pEOWA/F/Voj/YhAycTMGb
X-Received: by 10.66.119.201 with SMTP id kw9mr8293783pab.4.1438984469521;
        Fri, 07 Aug 2015 14:54:29 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.140.32.69 with SMTP id g63ls1903776qgg.73.gmail; Fri, 07 Aug
 2015 14:54:28 -0700 (PDT)
X-Received: by 10.140.31.70 with SMTP id e64mr47809qge.12.1438984468538;
        Fri, 07 Aug 2015 14:54:28 -0700 (PDT)
In-Reply-To: <798f7179-c397-4bad-abeb-1bb7493c9860@isocpp.org>
X-Original-Sender: isocppgroup@denisbider.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <http://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <http://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <http://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <http://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <http://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:19728
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/19728>

------=_Part_2548_1499900910.1438984467831
Content-Type: multipart/alternative; 
	boundary="----=_Part_2549_921098360.1438984467832"

------=_Part_2549_921098360.1438984467832
Content-Type: text/plain; charset=UTF-8

> - naturally interacts with copy/move constructors -
> easy to slip up and forget std::xref, resulting in a deep copy

And there we go, I did exactly that in the example:


  A(A~& x) : B(x), c(std::xref(x.c)), i(x.i) {}


Should be:


  A(A~& x) : B(std::xref(x)), c(std::xref(x.c)), i(x.i) {}


Arguably, we have the same problem with move constructors...

And arguably - it might be better if we didn't... :)


On Friday, August 7, 2015 at 3:51:41 PM UTC-6, isocp...@denisbider.com 
wrote:

> Great responses! Thank you!
>
> I urgently have to sleep, but I've had the following idea:
>
> Do you think we should approach this from the opposite direction - a 
> destructing constructor?
>
> I went with constructing destructor because it's easy to extend syntax for 
> it in an unambiguous way. However,
>
> If we're willing to introduce an explicit reference type for xvalues, we 
> could have this, which could arguably be *more* general:
>
> struct A : B {
>   A(A~& x) : B(x), c(std::xref(x.c)), i(x.i) {}
>   C c;
>   int i;};
>
>
> Pros:
>
> - everything is like move constructor - except this takes xvalue reference 
> instead of rvalue reference, and relies on std::xref instead of std::move
>
> - fully recognizes xvalues, gives them a reference type (~&)
>
> - naturally interacts with copy/move constructors
>
> - allows for xvalue assignment operator - maybe useful for returns from 
> functions when assigned to pre-existing object?
>
> Cons:
>
> - fully recognizes xvalues - yet another reference type...
>
> - naturally interacts with copy/move constructors - easy to slip up and 
> forget std::xref, resulting in a deep copy
>
> - allows for xvalue assignment operator - yet another special member...
>
> Thoughts?
>
>
> On Friday, August 7, 2015 at 3:32:51 PM UTC-6, Matthew Woehlke wrote:
>
>> On 2015-08-07 16:47, isocp...@denisbider.com wrote: 
>> > I believe the destructive move Jesus is upon us! 
>> > 
>> >  I have uploaded the following draft: 
>> > 
>> > http://www.denisbider.com/MoveDestructor.pdf 
>>
>> Editorial comments: 
>>
>> - Might want to explain "destructive move" in the opening paragraph. 
>>
>> - Might want to mention std::unique_ptr? This is a really simple example 
>> of a class that is trivially relocatable but has an "interesting" move 
>> constructor and "interesting" destructor. 
>>
>>
>> Nits: 
>>
>> - In the defaulted example, s.b. ~int(int&). That is, define the default 
>> behavior as cting-dtor for ALL members, and explain elsewhere when a 
>> cting-dtor is trivial (i.e. for POD types; the "consists of trivially 
>> relocatable members" case seems sufficiently covered) and that trivial 
>> means to just copy the bits. (Also, it's expected that the compiler will 
>> combine trivial cting-dtors of adjacent members into a single memcpy.) 
>> At least, I'd do that... seems cleaner. (Shouldn't actually change 
>> anything.) 
>>
>>
>> Not-so-nits: 
>>
>> - The multiple object helper should work on overlapping memory. I 
>> imagine you intended this, but I don't see any wording to that effect; 
>> it seems to me that such wording may be important. 
>>
>> - Should(n't) the cting-dtor be implicit-default if the class has a) a 
>> *default* move ctor *or copy ctor*, *and* b) a default dtor, whether or 
>> not such are declared? 
>>
>> - I feel fairly strongly that there should be a cutoff point for which 
>> we can use the same syntax to relocate objects that can't be simply 
>> relocated. I proposed that there is *always* a cting-dtor (except for 
>> objects that explicitly delete it, or can't be copied/moved and/or 
>> destroyed at all, i.e. the fallback implementation would be ill-formed), 
>> but at any rate, I think the helpers should work regardless. 
>>
>> - I'm not entirely confident that the composition case is solved. As 
>> worded, the class members are relocated after the base class has been 
>> destroyed (moveover, the derived class itself is technically "destroyed" 
>> after the base class has been destroyed), which seems like it could 
>> present problems... :-( Unfortunately I don't have any suggestions here. 
>> I do hope that this won't kill the proposal though. 
>>
>>
>> Comments: 
>>
>> - It took me a minute or two to understand the invocation helpers, but 
>> now that I do, I like! IIUC what these mean is that instead of libraries 
>> having to check a type trait and write a memmove themselves, the 
>> compiler will do so. Cool! 
>>
>>
>> Bikesheds (JFTR): 
>>
>> - ~A(A&) vs. ~A(A*) vs. ~A(void*). 
>>
>> - "cting-dtor" vs. "move-dtor" ;-). 
>>
>> - Type trait names. 
>>
>>
>> Thanks for sticking with this! 
>>
>> -- 
>> Matthew 
>>
>>

-- 

--- 
You received this message because you are subscribed to the Google Groups "ISO C++ Standard - Future Proposals" group.
To unsubscribe from this group and stop receiving emails from it, send an email to std-proposals+unsubscribe@isocpp.org.
To post to this group, send email to std-proposals@isocpp.org.
Visit this group at http://groups.google.com/a/isocpp.org/group/std-proposals/.

------=_Part_2549_921098360.1438984467832
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>&gt; - naturally interacts with copy/move constructor=
s -</div><div>&gt; easy to slip up and forget std::xref, resulting in a dee=
p copy</div><div><br></div><div>And there we go, I did exactly that in the =
example:</div><div><br></div><div><pre style=3D"background: rgb(246, 248, 2=
55); color: rgb(0, 0, 32);"><br></pre><pre style=3D"background: rgb(246, 24=
8, 255); color: rgb(0, 0, 32);">  A<span style=3D"color: rgb(48, 128, 128);=
">(</span>A<span style=3D"color: rgb(48, 128, 128);">~</span><span style=3D=
"color: rgb(48, 128, 128);">&amp;</span> x<span style=3D"color: rgb(48, 128=
, 128);">)</span> <span style=3D"color: rgb(64, 96, 128);">:</span> B<span =
style=3D"color: rgb(48, 128, 128);">(</span>x<span style=3D"color: rgb(48, =
128, 128);">)</span><span style=3D"color: rgb(48, 128, 128);">,</span> c<sp=
an style=3D"color: rgb(48, 128, 128);">(</span><span style=3D"color: rgb(0,=
 102, 238);">std</span><span style=3D"color: rgb(64, 96, 128);">::</span>xr=
ef<span style=3D"color: rgb(48, 128, 128);">(</span>x<span style=3D"color: =
rgb(48, 128, 128);">.</span>c<span style=3D"color: rgb(48, 128, 128);">)</s=
pan><span style=3D"color: rgb(48, 128, 128);">)</span><span style=3D"color:=
 rgb(48, 128, 128);">,</span> i<span style=3D"color: rgb(48, 128, 128);">(<=
/span>x<span style=3D"color: rgb(48, 128, 128);">.</span>i<span style=3D"co=
lor: rgb(48, 128, 128);">)</span> <span style=3D"color: rgb(64, 96, 128);">=
{</span><span style=3D"color: rgb(64, 96, 128);">}</span>

</pre></div><div><br></div><div>Should be:</div><div><br></div><div><pre st=
yle=3D"background: rgb(246, 248, 255); color: rgb(0, 0, 32);"><br></pre><pr=
e style=3D"background: rgb(246, 248, 255); color: rgb(0, 0, 32);">  A<span =
style=3D"color: rgb(48, 128, 128);">(</span>A<span style=3D"color: rgb(48, =
128, 128);">~</span><span style=3D"color: rgb(48, 128, 128);">&amp;</span> =
x<span style=3D"color: rgb(48, 128, 128);">)</span> <span style=3D"color: r=
gb(64, 96, 128);">:</span> B<span style=3D"color: rgb(48, 128, 128);">(<spa=
n style=3D"color: rgb(0, 102, 238);">std</span><span style=3D"color: rgb(64=
, 96, 128);">::</span><font color=3D"#000020">xref</font><span style=3D"col=
or: rgb(48, 128, 128);">(</span></span>x)<span style=3D"color: rgb(48, 128,=
 128);">)</span><span style=3D"color: rgb(48, 128, 128);">,</span> c<span s=
tyle=3D"color: rgb(48, 128, 128);">(</span><span style=3D"color: rgb(0, 102=
, 238);">std</span><span style=3D"color: rgb(64, 96, 128);">::</span>xref<s=
pan style=3D"color: rgb(48, 128, 128);">(</span>x<span style=3D"color: rgb(=
48, 128, 128);">.</span>c<span style=3D"color: rgb(48, 128, 128);">)</span>=
<span style=3D"color: rgb(48, 128, 128);">)</span><span style=3D"color: rgb=
(48, 128, 128);">,</span> i<span style=3D"color: rgb(48, 128, 128);">(</spa=
n>x<span style=3D"color: rgb(48, 128, 128);">.</span>i<span style=3D"color:=
 rgb(48, 128, 128);">)</span> <span style=3D"color: rgb(64, 96, 128);">{</s=
pan><span style=3D"color: rgb(64, 96, 128);">}</span>

</pre></div><p><br></p><div>Arguably, we have the same problem with move co=
nstructors...</div><div><br></div><div>And arguably - it might be better if=
 we didn&#39;t... :)</div><div><br><br>On Friday, August 7, 2015 at 3:51:41=
 PM UTC-6, isocp...@denisbider.com wrote:</div><blockquote class=3D"gmail_q=
uote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-co=
lor: rgb(204, 204, 204); border-left-width: 1px; border-left-style: solid;"=
><div dir=3D"ltr"><div>Great responses! Thank you!</div><div><br></div><div=
>I urgently have to sleep, but I&#39;ve had the following idea:</div><div><=
br></div><div>Do you think we should approach this from the opposite direct=
ion - a destructing constructor?</div><div><br></div><div>I went with const=
ructing destructor because it&#39;s easy to extend syntax for it in an unam=
biguous way. However,</div><div><br></div><div>If we&#39;re willing to intr=
oduce an explicit reference type for xvalues, we could have this, which cou=
ld arguably be <em>more</em> general:</div><div><br></div><pre style=3D"bac=
kground: rgb(246, 248, 255); color: rgb(0, 0, 32);"><span style=3D"color: r=
gb(32, 0, 128); font-weight: bold;">struct</span> A <span style=3D"color: r=
gb(64, 96, 128);">:</span> B <span style=3D"color: rgb(64, 96, 128);">{</sp=
an>
  A<span style=3D"color: rgb(48, 128, 128);">(</span>A<span style=3D"color:=
 rgb(48, 128, 128);">~</span><span style=3D"color: rgb(48, 128, 128);">&amp=
;</span> x<span style=3D"color: rgb(48, 128, 128);">)</span> <span style=3D=
"color: rgb(64, 96, 128);">:</span> B<span style=3D"color: rgb(48, 128, 128=
);">(</span>x<span style=3D"color: rgb(48, 128, 128);">)</span><span style=
=3D"color: rgb(48, 128, 128);">,</span> c<span style=3D"color: rgb(48, 128,=
 128);">(</span><span style=3D"color: rgb(0, 102, 238);">std</span><span st=
yle=3D"color: rgb(64, 96, 128);">::</span>xref<span style=3D"color: rgb(48,=
 128, 128);">(</span>x<span style=3D"color: rgb(48, 128, 128);">.</span>c<s=
pan style=3D"color: rgb(48, 128, 128);">)</span><span style=3D"color: rgb(4=
8, 128, 128);">)</span><span style=3D"color: rgb(48, 128, 128);">,</span> i=
<span style=3D"color: rgb(48, 128, 128);">(</span>x<span style=3D"color: rg=
b(48, 128, 128);">.</span>i<span style=3D"color: rgb(48, 128, 128);">)</spa=
n> <span style=3D"color: rgb(64, 96, 128);">{</span><span style=3D"color: r=
gb(64, 96, 128);">}</span>
  C c<span style=3D"color: rgb(64, 96, 128);">;</span>
  <span style=3D"color: rgb(32, 0, 128); font-weight: bold;">int</span> i<s=
pan style=3D"color: rgb(64, 96, 128);">;</span>
<span style=3D"color: rgb(64, 96, 128);">}</span><span style=3D"color: rgb(=
64, 96, 128);">;</span>

</pre><p><br></p><div>Pros:</div><div><br></div><div>- everything is like m=
ove constructor=C2=A0-=C2=A0except this takes xvalue reference instead of r=
value reference, and relies on std::xref instead of std::move</div><div><br=
></div><div>- fully recognizes xvalues, gives them a reference type (<span =
style=3D"color: rgb(48, 128, 128);">~</span><span style=3D"color: rgb(48, 1=
28, 128);">&amp;</span>)</div><div><br></div><div>- naturally interacts wit=
h copy/move constructors</div><div><br></div><div>- allows for xvalue assig=
nment operator - maybe useful for returns from functions when assigned to p=
re-existing object?</div><div><br></div><div>Cons:</div><div><br></div><div=
>- fully recognizes xvalues - yet another reference type...</div><div><br><=
/div><div>- naturally interacts with copy/move constructors - easy to slip =
up and forget std::xref, resulting in a deep copy</div><div><br></div><div>=
- allows for xvalue assignment operator - yet another special member...<br>=
</div><div><br></div><div>Thoughts?</div><div><br></div><div><br>On Friday,=
 August 7, 2015 at 3:32:51 PM UTC-6, Matthew Woehlke wrote:</div><blockquot=
e class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1=
ex; border-left-color: rgb(204, 204, 204); border-left-width: 1px; border-l=
eft-style: solid;">On 2015-08-07 16:47, <a rel=3D"nofollow">isocp...@denisb=
ider.com</a> wrote:
<br>&gt; I believe the destructive move Jesus is upon us!
<br>&gt;=20
<br>&gt; =C2=A0I have uploaded the following draft:
<br>&gt;=20
<br>&gt; <a onmousedown=3D"this.href=3D&#39;http://www.google.com/url?q\75h=
ttp%3A%2F%2Fwww.denisbider.com%2FMoveDestructor.pdf\46sa\75D\46sntz\0751\46=
usg\75AFQjCNEmOr4KskLTP7oqtb3GQp9_QLlboQ&#39;;return true;" onclick=3D"this=
..href=3D&#39;http://www.google.com/url?q\75http%3A%2F%2Fwww.denisbider.com%=
2FMoveDestructor.pdf\46sa\75D\46sntz\0751\46usg\75AFQjCNEmOr4KskLTP7oqtb3GQ=
p9_QLlboQ&#39;;return true;" href=3D"http://www.denisbider.com/MoveDestruct=
or.pdf" target=3D"_blank" rel=3D"nofollow">http://www.denisbider.com/<wbr>M=
oveDestructor.pdf</a>
<br>
<br>Editorial comments:
<br>
<br>- Might want to explain &quot;destructive move&quot; in the opening par=
agraph.
<br>
<br>- Might want to mention std::unique_ptr? This is a really simple exampl=
e
<br>of a class that is trivially relocatable but has an &quot;interesting&q=
uot; move
<br>constructor and &quot;interesting&quot; destructor.
<br>
<br>
<br>Nits:
<br>
<br>- In the defaulted example, s.b. ~int(int&amp;). That is, define the de=
fault
<br>behavior as cting-dtor for ALL members, and explain elsewhere when a
<br>cting-dtor is trivial (i.e. for POD types; the &quot;consists of trivia=
lly
<br>relocatable members&quot; case seems sufficiently covered) and that tri=
vial
<br>means to just copy the bits. (Also, it&#39;s expected that the compiler=
 will
<br>combine trivial cting-dtors of adjacent members into a single memcpy.)
<br>At least, I&#39;d do that... seems cleaner. (Shouldn&#39;t actually cha=
nge
<br>anything.)
<br>
<br>
<br>Not-so-nits:
<br>
<br>- The multiple object helper should work on overlapping memory. I
<br>imagine you intended this, but I don&#39;t see any wording to that effe=
ct;
<br>it seems to me that such wording may be important.
<br>
<br>- Should(n&#39;t) the cting-dtor be implicit-default if the class has a=
) a
<br>*default* move ctor *or copy ctor*, *and* b) a default dtor, whether or
<br>not such are declared?
<br>
<br>- I feel fairly strongly that there should be a cutoff point for which
<br>we can use the same syntax to relocate objects that can&#39;t be simply
<br>relocated. I proposed that there is *always* a cting-dtor (except for
<br>objects that explicitly delete it, or can&#39;t be copied/moved and/or
<br>destroyed at all, i.e. the fallback implementation would be ill-formed)=
,
<br>but at any rate, I think the helpers should work regardless.
<br>
<br>- I&#39;m not entirely confident that the composition case is solved. A=
s
<br>worded, the class members are relocated after the base class has been
<br>destroyed (moveover, the derived class itself is technically &quot;dest=
royed&quot;
<br>after the base class has been destroyed), which seems like it could
<br>present problems... :-( Unfortunately I don&#39;t have any suggestions =
here.
<br>I do hope that this won&#39;t kill the proposal though.
<br>
<br>
<br>Comments:
<br>
<br>- It took me a minute or two to understand the invocation helpers, but
<br>now that I do, I like! IIUC what these mean is that instead of librarie=
s
<br>having to check a type trait and write a memmove themselves, the
<br>compiler will do so. Cool!
<br>
<br>
<br>Bikesheds (JFTR):
<br>
<br>- ~A(A&amp;) vs. ~A(A*) vs. ~A(void*).
<br>
<br>- &quot;cting-dtor&quot; vs. &quot;move-dtor&quot; ;-).
<br>
<br>- Type trait names.
<br>
<br>
<br>Thanks for sticking with this!
<br>
<br>--=20
<br>Matthew
<br>
<br></blockquote></div></blockquote></div>

<p></p>

-- <br />
<br />
--- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/">http://groups.google.com/a/isocpp.org/group/std-proposals/<=
/a>.<br />

------=_Part_2549_921098360.1438984467832--
------=_Part_2548_1499900910.1438984467831--

.
