220 29892 <CAAbBDD_eUtvYsPriPV-QSLED4Taxde1ShCMOuqpMm924JGVyzw@mail.gmail.com> article
Path: news.gmane.org!.POSTED!not-for-mail
From: Jonathan Coe <jbcoe@me.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: New smart pointer: CopyConstructible and
 CopyAssignable flavor of unique_ptr
Date: Sat, 17 Dec 2016 21:23:29 +0000
Lines: 328
Approved: news@gmane.org
Message-ID: <CAAbBDD_eUtvYsPriPV-QSLED4Taxde1ShCMOuqpMm924JGVyzw@mail.gmail.com>
References: <3df7e8eb-01a0-7804-f476-504b5a25a9fe@gmail.com>
 <CAFk2RUaY3+MnXkmvaC=LxgRA_RD_XQpFfX-HT6X3iq1wD7ggCg@mail.gmail.com>
 <20161217170428.GA10214@manuel-ThinkPad-L440.localdomain> <20161217171633.4919375.58072.21574@gmail.com>
 <CAEddoJaAZkeJS9Maj2z0vYGnfuNnJZ+qFFdjeQyesTF5itJxHA@mail.gmail.com>
 <15884364-3238-41c7-bc5a-aa5595a64ade@isocpp.org> <20161217182130.GA4347@manuel-ThinkPad-L440.localdomain>
 <5eae5f16-e129-4c95-8001-fc73cc4f3d03@isocpp.org> <20161217192812.GA17421@manuel-ThinkPad-L440.localdomain>
 <cb822c5c-fc50-48e5-ad60-fdb14580329c@isocpp.org> <20161217210804.GA10967@manuel-ThinkPad-L440.localdomain>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary=f403045dd96047ae270543e14cbc
X-Trace: blaine.gmane.org 1482009815 3000 195.159.176.226 (17 Dec 2016 21:23:35 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Sat, 17 Dec 2016 21:23:35 +0000 (UTC)
To: "std-proposals@isocpp.org" <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBC2JVFPBRAHBBUWZ23BAKGQEJZE3JWA@isocpp.org Sat Dec 17 22:23:30 2016
Return-path: <std-proposals+bncBC2JVFPBRAHBBUWZ23BAKGQEJZE3JWA@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-pf0-f198.google.com ([209.85.192.198])
	by blaine.gmane.org with esmtp (Exim 4.84_2)
	(envelope-from <std-proposals+bncBC2JVFPBRAHBBUWZ23BAKGQEJZE3JWA@isocpp.org>)
	id 1cIMRy-00081i-Ua
	for gclcip-std-proposals@m.gmane.org; Sat, 17 Dec 2016 22:23:27 +0100
Original-Received: by mail-pf0-f198.google.com with SMTP id y68sf173813190pfb.6
        for <gclcip-std-proposals@m.gmane.org>; Sat, 17 Dec 2016 13:23:31 -0800 (PST)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:mime-version:sender:in-reply-to:references:from
         :date:message-id:subject:to:x-original-sender
         :x-original-authentication-results:reply-to:precedence:mailing-list
         :list-id:x-spam-checked-in-group:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe;
        bh=pReEAs3NpFQ2wm6LZIna3Yhl6GOsvXfInaMgz0oQ68k=;
        b=YiugZ5vVGj3tUxPPJsoKbmlxchT1DWC3rI/GQ5lOr1MUDKmeqhW8qFnfpqg8XSCNLZ
         ZE/Xg8o3RRnbzfnw9rCvTtrT8PNl7+KzSXXGsNzZjFuMYfpt7+5qEVwKy+MbkNd8bbCb
         rudry/6UP2qbTBuSl4hkql9FDcCFkvawj6zNodCdWzVh+QZtEQy88hS5me9Dg30CVF0E
         714h4RrwDNP4wXWxoIw6bIFZYJzJPk4Ukzf/6tX4XTXkeQRudOXQmd2e2RrX5PurfZk/
         tXlqQC75BF5V+1p8yE41jV2H1AF1E07uprG0nq+5nUE6nkLMpchEw1NNUPQtrqvdXH5l
         Fabg==
X-Gm-Message-State: AKaTC03HlFOvmNeagusl40QWu6Otja3ZXnSHkckiqU+qtS8etzyAp5N+HZ0AkEE757AO0A==
X-Received: by 10.98.21.16 with SMTP id 16mr1788428pfv.17.1482009811128;
        Sat, 17 Dec 2016 13:23:31 -0800 (PST)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.157.29.137 with SMTP id y9ls10582497otd.39.gmail; Sat, 17 Dec
 2016 13:23:30 -0800 (PST)
X-Received: by 10.159.36.107 with SMTP id 98mr1165019uaq.27.1482009810387;
        Sat, 17 Dec 2016 13:23:30 -0800 (PST)
Original-Received: from mail-ua0-x235.google.com (mail-ua0-x235.google.com. [2607:f8b0:400c:c08::235])
        by mx.google.com with ESMTPS id s134si3514968vkh.44.2016.12.17.13.23.30
        for <std-proposals@isocpp.org>
        (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128);
        Sat, 17 Dec 2016 13:23:30 -0800 (PST)
Received-SPF: pass (google.com: domain of jonathanbcoe@gmail.com designates 2607:f8b0:400c:c08::235 as permitted sender) client-ip=2607:f8b0:400c:c08::235;
Original-Received: by mail-ua0-x235.google.com with SMTP id y13so22875667uay.1
        for <std-proposals@isocpp.org>; Sat, 17 Dec 2016 13:23:30 -0800 (PST)
X-Received: by 10.176.85.24 with SMTP id t24mr8098779uaa.21.1482009810020;
 Sat, 17 Dec 2016 13:23:30 -0800 (PST)
Original-Sender: jonathanbcoe@gmail.com
Original-Received: by 10.176.1.242 with HTTP; Sat, 17 Dec 2016 13:23:29 -0800 (PST)
In-Reply-To: <20161217210804.GA10967@manuel-ThinkPad-L440.localdomain>
X-Original-Sender: jonathanbcoe@gmail.com
X-Original-Authentication-Results: mx.google.com;       dkim=pass
 header.i=@gmail.com;       spf=pass (google.com: domain of
 jonathanbcoe@gmail.com designates 2607:f8b0:400c:c08::235 as permitted
 sender) smtp.mailfrom=jonathanbcoe@gmail.com;       dmarc=fail (p=NONE
 dis=NONE) header.from=me.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://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>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:29892
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/29892>

--f403045dd96047ae270543e14cbc
Content-Type: text/plain; charset=UTF-8

On 17 December 2016 at 21:08, Manuel Bergler <berglerma@gmail.com> wrote:

> On Sat, Dec 17, 2016 at 12:35:03PM -0800, Nicol Bolas wrote:
>
>>     It is different.
>>
>>     Consider for example something like
>>
>>         my_obj = std::accumulate(input.begin(), input.end(),
>>     std::move(my_obj),
>>                                  some_function);
>>
>>     Afterwards references to my_obj will still be valid and correctly
>> point
>>     to the
>>     modified object.
>>
>>     On the other hand, if you have
>>
>>         auto f = [&someObj] (auto& acc, auto const& in) -> decltype(auto)
>> {
>>             acc->doSomethingModifyingThePointeeObj(in);
>>             someObj.doSomething(acc)  // note I really want the cloning
>> here
>>                                       // so I need to pass in the
>> clone_ptr
>>                                       // and not the pointee
>>             return std::move(acc);
>>         };
>>
>>         my_clone_ptr = std::accumulate(input.begin(), input.end(),
>>     std::move(my_clone_ptr), f);
>>
>>     now suddenly all references you got by calling `*my_clone_ptr`
>> somewhen
>>     before
>>     might or might not be invalid,
>>
>>   Actually, the standard guarantees that it isn't valid. Your
>>   `move(my_clone_ptr)` will move-construct the `init` parameter of
>>   `accumulate`. However, the standard says:
>>
>>   > Computes its result by initializing the accumulator acc with the
>> initial
>>   value init
>>
>>   This means that it creates a new `T` called `acc`, which is initialized
>> by
>>   the `init` value. Therefore, it will initialize `acc` by copy. `init`
>> will
>>   hold the original pointer until the end of `accumulate`, when it will be
>>   destroyed. What will be returned is `acc`, which is a copy of `init`.
>>
>>
>
> Apparently clang and gcc interpret this differently: They move it into
> place due to the std::move (see http://coliru.stacked-crooked.
> com/a/cbe39ffef2ebf716).
>
> So in case of clang/gcc in my example the call to std::accumulate wouldn't
> invalidate existing references. But who knows, maybe some implementer of
> the standard library will interpret the requirements the same way you did
> and actually perform a copy. But only forgetting to `return
> std::move(acc);` in the lambda used for `std::accumulate` and using just
> `return acc;` results in a copy.
>
> This is the entire point: When even very experienced people are not able to
> predict what will happen, how is this a good feature? It is just too hard
> to
> use correctly.
>
>
>>     even though I moved the original clone_ptr into
>>     the algorithm to ensure that it doesn't get copied.
>>
>>   Replace `clone_ptr` with `any`. Or `vector`. Many types have this
>> problem
>>   with `accumulate`; I don't see why adding one more will hurt anything.
>>
>
> This is because these types don't act as pointers; you're not supposed to
> store references to individual elements of a vector or a std::any, whereas
> the interface of this copy_ptr is designed to do exactly that, even though
> it is dangerous/unpredictable.
>
> The only way to get around that issue is to not have additional references
> to the pointee, but then there is no need to have the smart pointer
> interface and you can just use `indirect<T>`.
>
>
Finishing touches to `polymorphic_value` (formerly know as `indirect`) are
being made here https://github.com/jbcoe/polymorphic_value.



>
>>   --
>>   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 [1]std-proposals+unsubscribe@isocpp.org.
>>   To post to this group, send email to [2]std-proposals@isocpp.org.
>>   To view this discussion on the web visit
>>   [3]https://groups.google.com/a/isocpp.org/d/msgid/std-propos
>> als/cb822c5c-fc50-48e5-ad60-fdb14580329c%40isocpp.org.
>>
>> References
>>
>>   Visible links
>>   1. mailto:std-proposals+unsubscribe@isocpp.org
>>   2. mailto:std-proposals@isocpp.org
>>   3. https://groups.google.com/a/isocpp.org/d/msgid/std-proposals
>> /cb822c5c-fc50-48e5-ad60-fdb14580329c%40isocpp.org?utm_
>> medium=email&utm_source=footer
>>
>
> --
> 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.
> To view this discussion on the web visit https://groups.google.com/a/is
> ocpp.org/d/msgid/std-proposals/20161217210804.GA10967%
> 40manuel-ThinkPad-L440.localdomain.
>

-- 
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.
To view this discussion on the web visit https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAAbBDD_eUtvYsPriPV-QSLED4Taxde1ShCMOuqpMm924JGVyzw%40mail.gmail.com.

--f403045dd96047ae270543e14cbc
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On 17 December 2016 at 21:08, Manuel Bergler <span dir=3D"ltr">&lt;<a h=
ref=3D"mailto:berglerma@gmail.com" target=3D"_blank">berglerma@gmail.com</a=
>&gt;</span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0p=
x 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);bo=
rder-left-style:solid;padding-left:1ex"><div class=3D"gmail-HOEnZb"><div cl=
ass=3D"gmail-h5">On Sat, Dec 17, 2016 at 12:35:03PM -0800, Nicol Bolas wrot=
e:<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-=
left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;p=
adding-left:1ex">
=C2=A0 =C2=A0 It is different.<br>
<br>
=C2=A0 =C2=A0 Consider for example something like<br>
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 my_obj =3D std::accumulate(input.begin(), input=
..end(),<br>
=C2=A0 =C2=A0 std::move(my_obj),<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0some_function);<br>
<br>
=C2=A0 =C2=A0 Afterwards references to my_obj will still be valid and corre=
ctly point<br>
=C2=A0 =C2=A0 to the<br>
=C2=A0 =C2=A0 modified object.<br>
<br>
=C2=A0 =C2=A0 On the other hand, if you have<br>
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 auto f =3D [&amp;someObj] (auto&amp; acc, auto =
const&amp; in) -&gt; decltype(auto) {<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 acc-&gt;doSomethingModifyingThePo=
<wbr>inteeObj(in);<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 someObj.doSomething(acc) =C2=A0//=
 note I really want the cloning here<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // so I need to=
 pass in the clone_ptr<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // and not the =
pointee<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return std::move(acc);<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 };<br>
<br>
=C2=A0 =C2=A0 =C2=A0 =C2=A0 my_clone_ptr =3D std::accumulate(input.begin(),=
 input.end(),<br>
=C2=A0 =C2=A0 std::move(my_clone_ptr), f);<br>
<br>
=C2=A0 =C2=A0 now suddenly all references you got by calling `*my_clone_ptr=
` somewhen<br>
=C2=A0 =C2=A0 before<br>
=C2=A0 =C2=A0 might or might not be invalid,<br>
<br>
=C2=A0 Actually, the standard guarantees that it isn&#39;t valid. Your<br>
=C2=A0 `move(my_clone_ptr)` will move-construct the `init` parameter of<br>
=C2=A0 `accumulate`. However, the standard says:<br>
<br>
=C2=A0 &gt; Computes its result by initializing the accumulator acc with th=
e initial<br>
=C2=A0 value init<br>
<br>
=C2=A0 This means that it creates a new `T` called `acc`, which is initiali=
zed by<br>
=C2=A0 the `init` value. Therefore, it will initialize `acc` by copy. `init=
` will<br>
=C2=A0 hold the original pointer until the end of `accumulate`, when it wil=
l be<br>
=C2=A0 destroyed. What will be returned is `acc`, which is a copy of `init`=
..<br>
=C2=A0 =C2=A0<br>
</blockquote>
<br></div></div>
Apparently clang and gcc interpret this differently: They move it into plac=
e due to the std::move (see <a href=3D"http://coliru.stacked-crooked.com/a/=
cbe39ffef2ebf716" rel=3D"noreferrer" target=3D"_blank">http://coliru.stacke=
d-crooked.<wbr>com/a/cbe39ffef2ebf716</a>).<br>
<br>
So in case of clang/gcc in my example the call to std::accumulate wouldn&#3=
9;t invalidate existing references. But who knows, maybe some implementer o=
f the standard library will interpret the requirements the same way you did=
 and actually perform a copy. But only forgetting to `return std::move(acc)=
;` in the lambda used for `std::accumulate` and using just `return acc;` re=
sults in a copy.<br>
<br>
This is the entire point: When even very experienced people are not able to=
<br>
predict what will happen, how is this a good feature? It is just too hard t=
o<br>
use correctly.<span class=3D"gmail-"><br>
<br>
<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-=
left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;p=
adding-left:1ex">
<br>
=C2=A0 =C2=A0 even though I moved the original clone_ptr into<br>
=C2=A0 =C2=A0 the algorithm to ensure that it doesn&#39;t get copied.<br>
<br>
=C2=A0 Replace `clone_ptr` with `any`. Or `vector`. Many types have this pr=
oblem<br>
=C2=A0 with `accumulate`; I don&#39;t see why adding one more will hurt any=
thing.<br>
</blockquote>
<br></span>
This is because these types don&#39;t act as pointers; you&#39;re not suppo=
sed to store references to individual elements of a vector or a std::any, w=
hereas the interface of this copy_ptr is designed to do exactly that, even =
though it is dangerous/unpredictable.<br>
<br>
The only way to get around that issue is to not have additional references =
to the pointee, but then there is no need to have the smart pointer interfa=
ce and you can just use `indirect&lt;T&gt;`.<br>
<br></blockquote><div><br></div><div>Finishing touches to `polymorphic_valu=
e` (formerly know as `indirect`) are being made here <a href=3D"https://git=
hub.com/jbcoe/polymorphic_value">https://github.com/jbcoe/polymorphic_value=
</a>.</div><div><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote=
" style=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color=
:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-=
left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;p=
adding-left:1ex"><span class=3D"gmail-">
<br>
=C2=A0 --<br>
=C2=A0 You received this message because you are subscribed to the Google G=
roups<br>
=C2=A0 &quot;ISO C++ Standard - Future Proposals&quot; group.<br>
=C2=A0 To unsubscribe from this group and stop receiving emails from it, se=
nd an<br></span>
=C2=A0 email to [1]<a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org=
" target=3D"_blank">std-proposals+unsubscribe@i<wbr>socpp.org</a>.<br>
=C2=A0 To post to this group, send email to [2]<a href=3D"mailto:std-propos=
als@isocpp.org" target=3D"_blank">std-proposals@isocpp.org</a>.<span class=
=3D"gmail-"><br>
=C2=A0 To view this discussion on the web visit<br></span>
=C2=A0 [3]<a href=3D"https://groups.google.com/a/isocpp.org/d/msgid/std-pro=
posals/cb822c5c-fc50-48e5-ad60-fdb14580329c%40isocpp.org" rel=3D"noreferrer=
" target=3D"_blank">https://groups.google.com/a<wbr>/isocpp.org/d/msgid/std=
-propos<wbr>als/cb822c5c-fc50-48e5-ad60-<wbr>fdb14580329c%40isocpp.org</a>.=
<br>
<br>
References<br>
<br>
=C2=A0 Visible links<br>
=C2=A0 1. mailto:<a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org" =
target=3D"_blank">std-proposals+unsubscri<wbr>be@isocpp.org</a><br>
=C2=A0 2. mailto:<a href=3D"mailto:std-proposals@isocpp.org" target=3D"_bla=
nk">std-proposals@isocpp.or<wbr>g</a><br>
=C2=A0 3. <a href=3D"https://groups.google.com/a/isocpp.org/d/msgid/std-pro=
posals/cb822c5c-fc50-48e5-ad60-fdb14580329c%40isocpp.org?utm_medium=3Demail=
&amp;utm_source=3Dfooter" rel=3D"noreferrer" target=3D"_blank">https://grou=
ps.google.com/a/is<wbr>ocpp.org/d/msgid/std-proposals<wbr>/cb822c5c-fc50-48=
e5-ad60-<wbr>fdb14580329c%40isocpp.org?utm_<wbr>medium=3Demail&amp;utm_sour=
ce=3Dfooter</a><br>
</blockquote><span class=3D"gmail-">
<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%2Bunsubscribe@isocpp.org" target=3D=
"_blank">std-proposals+unsubscribe@isoc<wbr>pp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/20161217210804.GA10967%40manuel-Think=
Pad-L440.localdomain" rel=3D"noreferrer" target=3D"_blank">https://groups.g=
oogle.com/a/is<wbr>ocpp.org/d/msgid/std-proposals<wbr>/20161217210804.GA109=
67%<wbr>40manuel-ThinkPad-L440.<wbr>localdomain</a>.<br>
</blockquote></div><br></div></div>

<p></p>

-- <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 />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CAAbBDD_eUtvYsPriPV-QSLED4Taxde1ShCMO=
uqpMm924JGVyzw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAAbBDD_eUtvYsPri=
PV-QSLED4Taxde1ShCMOuqpMm924JGVyzw%40mail.gmail.com</a>.<br />

--f403045dd96047ae270543e14cbc--

.
