220 32350 <d832c461-fa3e-429e-a36b-1d0b11eb634f@isocpp.org> article
Path: news.gmane.org!.POSTED!not-for-mail
From: Mingxin Wang <wmx16835vv@163.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: =?UTF-8?B?UmU6IFtzdGQtcHJvcG9zYWxzXSBSZTogQWRkaW5nIHRoZSBLZXl3b3JkIOKAnGludGVyZg==?=
	=?UTF-8?B?YWNl4oCdIGluIEMrKw==?=
Date: Mon, 8 May 2017 23:10:15 -0700 (PDT)
Lines: 292
Approved: news@gmane.org
Message-ID: <d832c461-fa3e-429e-a36b-1d0b11eb634f@isocpp.org>
References: <c8742174-fef0-44a9-988d-2c8aebba9243@isocpp.org>
 <CACL3gUXPSVdsT0Z77igxGVtHU9ALGPcN=7hwKKKfBmt8eQmXtA@mail.gmail.com>
 <9ee212eb-4037-40c4-94c3-57a9a170a4c3@isocpp.org> <1765502.4y06pMOS3s@tjmaciei-mobl1>
 <e8fb03f4-8c94-46c2-a612-acab81117998@isocpp.org>
 <CAOHCbiswurpbE6tG3igWTsFfpJ=LAeT9PoTUZBNsrnMOhEwSxQ@mail.gmail.com>
 <45a81e95-d352-49ab-9c6e-7375aa41413c@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_758_274165352.1494310215176"
X-Trace: blaine.gmane.org 1494310222 514 195.159.176.226 (9 May 2017 06:10:22 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Tue, 9 May 2017 06:10:22 +0000 (UTC)
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBDNMBNHJWIGBBR52YXEAKGQELFIY26Q@isocpp.org Tue May 09 08:10:17 2017
Return-path: <std-proposals+bncBDNMBNHJWIGBBR52YXEAKGQELFIY26Q@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-pf0-f200.google.com ([209.85.192.200])
	by blaine.gmane.org with esmtp (Exim 4.84_2)
	(envelope-from <std-proposals+bncBDNMBNHJWIGBBR52YXEAKGQELFIY26Q@isocpp.org>)
	id 1d7yLg-0008Ld-NV
	for gclcip-std-proposals@m.gmane.org; Tue, 09 May 2017 08:10:17 +0200
Original-Received: by mail-pf0-f200.google.com with SMTP id b17sf79770213pfd.1
        for <gclcip-std-proposals@m.gmane.org>; Mon, 08 May 2017 23:10:22 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=date:from:to:message-id:in-reply-to:references:subject:mime-version
         :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=CMH35W+ZnPIeY5oGRPXgeIvIpvt+hp4u/aQ+hdcuGwo=;
        b=lm9n6NXAvzjAT9FbFQg/3YPbC74HRVCuOLqVgmW/+yXAwYYEwmpQTof3TeuTGmovzd
         QbPrcXqS/u7xlbVgktC7O5GHsvM9yKEea4UXM5f5IoymGr/iWLsKMPlOsZIe5IOnOg4U
         F6C1W5RgOfowmteTJeTMukU43OTTYBgJ8QwwTn2bpyngn+obtd/LnLoBVMWg05FY5jZa
         4T2+gYh5Q/rL8hTPssDUYLjy67/PuVEwUWGZR0iv8dVVxkeR8yOCCypINfyUcKs0/VtD
         py8Pxq+jPNDo3U3jo3YOBleTQVg40a/VL/bsmzwfrRPzHi109hd1xSM6Hq8a9R+H2KIe
         nhJA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:date:from:to:message-id:in-reply-to:references
         :subject:mime-version: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=CMH35W+ZnPIeY5oGRPXgeIvIpvt+hp4u/aQ+hdcuGwo=;
        b=YJ87BYjnC6oDf1VISl/ZHgzZM04dvY1mBHnrBY7DMHyBABLiwsM0v5mFUdJMgULGua
         Kq/aavNrxzJDfYSy4TzcnV6xOFcEdyYlBdirDimCQx0PjqAhrqhcHLO3C6WKNwgat9Dz
         iwL8LP4+Gqa/IYFofW65Sp49PDzGAgij3P+zsBzmDG4aK2qPDJ2wZnxFXNTheoaXxkRL
         xK/OSCmAGiu4Pi/8GA2CZwhrqBCiF3Kk/SBGQVgS6SnVZfeZrlQyjO4PGh2B8CEe78L5
         +lBnSiAgwigzM76erV9zRxTdPv9Q6UeR7+Vr4NFcJiK0TcRaBclRYVGqkr2NgylaafEV
         d2rA==
X-Gm-Message-State: AN3rC/74ahjYNNN3aayDlsDSDra4dZm6pqGs4ZIn+Ka13UoWnrZi/nC3
	9swqsmFWLwHXQg==
X-Received: by 10.99.116.4 with SMTP id p4mr10540625pgc.14.1494310216858;
        Mon, 08 May 2017 23:10:16 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.157.15.73 with SMTP id 67ls10452136ott.21.gmail; Mon, 08 May
 2017 23:10:15 -0700 (PDT)
X-Received: by 10.157.84.44 with SMTP id j44mr1335964oth.16.1494310215808;
        Mon, 08 May 2017 23:10:15 -0700 (PDT)
In-Reply-To: <45a81e95-d352-49ab-9c6e-7375aa41413c@isocpp.org>
X-Original-Sender: wmx16835vv@163.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:32350
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/32350>

------=_Part_758_274165352.1494310215176
Content-Type: multipart/alternative; 
	boundary="----=_Part_759_1725561650.1494310215177"

------=_Part_759_1725561650.1494310215177
Content-Type: text/plain; charset=UTF-8

Dear Mr. Riedle,

Thank you for your recognition!

I have thought about the idea you posted about possible compile-time 
deduction, and I found it is *positive *for compiler optimization, but it 
shall not be abused. For example:

Callable<void()> a([] { puts("Lambda"); });
a();

is OK to be compiled (after compiler optimization) as

puts("Lambda");

But

std::vector<function<void()>> a;
std::vector<Callable<void()>> b(a);

is ill-formed.

An interface is a type, like integral types, classes, lambda expressions, 
etc. The reason why the code above is ill-formed is similar with the code 
below (also ill-formed):

std::vector<int> a;
std::vector<double> b(a);

Thank you!

Mingxin Wang

On Tuesday, May 9, 2017 at 4:48:55 AM UTC+8, Jakob Riedle wrote:
>
> At first I was very skeptical of the proposal to add something that I 
> though to be already in the language.
> The topic being discussed here now seems to me the missing link between 
> concepts and type erasure!!
>
> Thank you Mingxin Wang!
>
> Foo foo; // foo happens to model Concept
>> std::erased<Concept> efoo = foo;
>> func(efoo);  // Not a templatized function
>>
> Nice idea!
>
> Can we make that even more awesome?? YES!!
>
> How about this:
>
> void func(){
>  // ...
> }
>
> int main(){
> // Here the concept 'Callable' is used at a non-deduced context (where no 
> deduction happens)
> // Therefore, the Concept will automatically be interpreted as an abstract 
> class to which other types can be type erased to.
> std::vector<Callable> myVec;
> myVec.emplace( &func );
> }
>
> class MyClass{
>  std::vector<Callable> myVec; // same applies here since we are in an 
> undeduced context
>
>  void set_vector( std::vector<Callable> newVec ){ // This is still a 
> function template where Callable might be deduced as std::function<void()>
>   myVec = std::move(newVec); // Here an implicit conversion happens from 
> the potentially specialized vector (e.g. 
> std::vector<std::function<void()>>) to the vector of type erased Callables
>  }
> }
>
> Whenever compile time type deduction *can *happen, it will, *analog to 
> contextpr*.
> This is both very efficient and intuitive if you think about it.
> Another example might be helpful:
>
> void do_something( std::vector<Callable> vec ){
> // ...
> }
>
> std::vector<Callable> foo1;
> std::vector<std::function<void()>> foo2;
>
> do_something( foo1 ); // 'vec' will stay a vector of type erased Callables
> do_something( foo2 ); // 'vec' will be deduced to 
> std::vector<std::function<void()>>
>
> Again: Everything that can be deduced at compile time will and everything 
> that cannot will be deferred to run time.
> Since this interpretation of concepts as implicit base classes only 
> happens in undeduced contexts (this is currently not allowed), its not 
> breaking code.
>
> How 'bout that???
>
> Cheers,
> Jakob
>

-- 
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/d832c461-fa3e-429e-a36b-1d0b11eb634f%40isocpp.org.

------=_Part_759_1725561650.1494310215177
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div><font face=3D"georgia, serif">Dear Mr.=C2=A0Riedle,</=
font></div><div><font face=3D"georgia, serif"><br></font></div><div><font f=
ace=3D"georgia, serif">Thank you for your recognition!</font><br></div><div=
><font face=3D"georgia, serif"><br></font></div><div><font face=3D"georgia,=
 serif">I have thought about the idea</font><span style=3D"font-family: geo=
rgia, serif;">=C2=A0you posted</span><span style=3D"font-family: georgia, s=
erif;">=C2=A0</span><span style=3D"font-family: georgia, serif;">about=C2=
=A0possible compile-time deduction</span><span style=3D"font-family: georgi=
a, serif;">, and I found it is=C2=A0</span><span style=3D"font-family: geor=
gia, serif; line-height: 17px;"><b>positive </b>for=C2=A0compiler optimizat=
ion, but it shall not be abused. For example:</span></div><div><span style=
=3D"font-family: georgia, serif; line-height: 17px;"><br></span></div><div>=
<span style=3D"font-family: georgia, serif; line-height: 17px;"><div class=
=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); word-wrap: =
break-word; background-color: rgb(250, 250, 250);"><code class=3D"prettypri=
nt"><div class=3D"subprettyprint"><div class=3D"subprettyprint">Callable&lt=
;void()&gt; a([] { puts(&quot;Lambda&quot;); });</div><div class=3D"subpret=
typrint">a();</div></div></code></div><br>is OK to be compiled</span><span =
style=3D"font-family: georgia, serif; line-height: 17px;">=C2=A0(after=C2=
=A0</span><span style=3D"font-family: georgia, serif; line-height: 17px;">c=
ompiler optimization</span><span style=3D"font-family: georgia, serif; line=
-height: 17px;">)</span><span style=3D"font-family: georgia, serif; line-he=
ight: 17px;">=C2=A0as</span></div><div><span style=3D"font-family: georgia,=
 serif; line-height: 17px;"><br></span></div><div><div class=3D"prettyprint=
" style=3D"border: 1px solid rgb(187, 187, 187); word-wrap: break-word; bac=
kground-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div class=
=3D"subprettyprint"><font color=3D"#660066"><span style=3D"line-height: 17p=
x;">puts(&quot;Lambda&quot;);</span></font><br></div></code></div><br><font=
 face=3D"georgia, serif">But</font></div><div><font face=3D"georgia, serif"=
><br></font></div><div><font face=3D"georgia, serif"><div class=3D"prettypr=
int" style=3D"border: 1px solid rgb(187, 187, 187); word-wrap: break-word; =
background-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div cla=
ss=3D"subprettyprint"><div class=3D"subprettyprint">std::vector&lt;function=
&lt;void()&gt;&gt; a;</div><div class=3D"subprettyprint">std::vector&lt;Cal=
lable&lt;void()&gt;&gt; b(a);</div></div></code></div><br>is=C2=A0ill-forme=
d.</font></div><div><font face=3D"georgia, serif"><br></font></div><font fa=
ce=3D"georgia, serif">An interface is a type, like=C2=A0integral types,=C2=
=A0classes, lambda expressions, etc. The reason why the code above is=C2=A0=
</font><span style=3D"font-family: georgia, serif;">ill-formed</span><font =
face=3D"georgia, serif">=C2=A0is similar with the code below (also ill-form=
ed):</font><div><font face=3D"georgia, serif"><br></font></div><div><font f=
ace=3D"georgia, serif"><div class=3D"prettyprint" style=3D"border: 1px soli=
d rgb(187, 187, 187); word-wrap: break-word; background-color: rgb(250, 250=
, 250);"><code class=3D"prettyprint"><div class=3D"subprettyprint"><div cla=
ss=3D"subprettyprint">std::vector&lt;int&gt; a;</div><div class=3D"subprett=
yprint">std::vector&lt;double&gt; b(a);</div></div></code></div><div><font =
face=3D"georgia, serif"><br></font></div>Thank you!</font></div><div><font =
face=3D"georgia, serif"><br></font></div><div><font face=3D"georgia, serif"=
>Mingxin Wang<br></font><br>On Tuesday, May 9, 2017 at 4:48:55 AM UTC+8, Ja=
kob Riedle wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr"><div>At first I was very skeptical of the proposal to add something tha=
t I though to be already in the language.<br></div><div>The topic being dis=
cussed here now seems to me the missing link between concepts and type eras=
ure!!</div><div><br></div><div>Thank you Mingxin Wang!</div><div><b><br></b=
></div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div><=
div dir=3D"ltr"><div>Foo foo; // foo happens to model Concept<br></div><div=
>std::erased&lt;Concept&gt; efoo =3D foo;<br></div><div>func(efoo);=C2=A0 /=
/ Not a templatized function</div></div></div></div></div></blockquote><div=
>Nice idea!</div><div><br></div><div>Can we make that even more awesome?? Y=
ES!!</div><div><br></div><div>How about this:</div><div><br></div><div styl=
e=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border=
-style:solid;border-width:1px;word-wrap:break-word"><code><div><span style=
=3D"color:#008">void</span><span style=3D"color:#000"> func</span><span sty=
le=3D"color:#660">(){</span><span style=3D"color:#000"><br>=C2=A0</span><sp=
an style=3D"color:#800">// ...</span><span style=3D"color:#000"><br></span>=
<span style=3D"color:#660">}</span><span style=3D"color:#000"><br><br></spa=
n><span style=3D"color:#008">int</span><span style=3D"color:#000"> main</sp=
an><span style=3D"color:#660">(){</span><span style=3D"color:#000"><br></sp=
an><span style=3D"color:#800">// Here the concept &#39;Callable&#39; is use=
d at a non-deduced context (where no deduction happens)</span><span style=
=3D"color:#000"><br></span><span style=3D"color:#800">// Therefore, the Con=
cept will automatically be interpreted as an abstract class to which other =
types can be type erased to.</span><span style=3D"color:#000"><br>std</span=
><span style=3D"color:#660">::</span><span style=3D"color:#000">vector</spa=
n><span style=3D"color:#660">&lt;</span><span style=3D"color:#606">Callable=
</span><span style=3D"color:#660">&gt;</span><span style=3D"color:#000"> my=
Vec</span><span style=3D"color:#660">;</span><span style=3D"color:#000"><br=
>myVec</span><span style=3D"color:#660">.</span><span style=3D"color:#000">=
emplace</span><span style=3D"color:#660">(</span><span style=3D"color:#000"=
> </span><span style=3D"color:#660">&amp;</span><span style=3D"color:#000">=
func </span><span style=3D"color:#660">);</span><span style=3D"color:#000">=
<br></span><span style=3D"color:#660">}</span><span style=3D"color:#000"><b=
r><br></span><span style=3D"color:#008">class</span><span style=3D"color:#0=
00"> </span><span style=3D"color:#606">MyClass</span><span style=3D"color:#=
660">{</span><span style=3D"color:#000"><br>=C2=A0std</span><span style=3D"=
color:#660">::</span><span style=3D"color:#000">vector</span><span style=3D=
"color:#660">&lt;</span><span style=3D"color:#606">Callable</span><span sty=
le=3D"color:#660">&gt;</span><span style=3D"color:#000"> myVec</span><span =
style=3D"color:#660">;</span><span style=3D"color:#000"> </span><span style=
=3D"color:#800">// same applies here since we are in an undeduced context</=
span><span style=3D"color:#000"><br><br>=C2=A0</span><span style=3D"color:#=
008">void</span><span style=3D"color:#000"> set_vector</span><span style=3D=
"color:#660">(</span><span style=3D"color:#000"> std</span><span style=3D"c=
olor:#660">::</span><span style=3D"color:#000">vector</span><span style=3D"=
color:#660">&lt;</span><span style=3D"color:#606">Callable</span><span styl=
e=3D"color:#660">&gt;</span><span style=3D"color:#000"> newVec </span><span=
 style=3D"color:#660">){</span><span style=3D"color:#000"> </span><span sty=
le=3D"color:#800">// This is still a function template where Callable might=
 be deduced as std::function&lt;void()&gt;</span><span style=3D"color:#000"=
><br>=C2=A0 myVec </span><span style=3D"color:#660">=3D</span><span style=
=3D"color:#000"> std</span><span style=3D"color:#660">::</span><span style=
=3D"color:#000">move</span><span style=3D"color:#660">(</span><span style=
=3D"color:#000">newVec</span><span style=3D"color:#660">);</span><span styl=
e=3D"color:#000"> </span><span style=3D"color:#800">// Here an implicit con=
version happens from the potentially specialized vector (e.g. std::vector&l=
t;std::function&lt;<wbr>void()&gt;&gt;) to the vector of type erased Callab=
les</span><span style=3D"color:#000"><br>=C2=A0</span><span style=3D"color:=
#660">}</span><span style=3D"color:#000"><br></span><span style=3D"color:#6=
60">}</span><span style=3D"color:#000"><br></span></div></code></div><div><=
br></div><div>Whenever compile time type deduction <b>can </b>happen, it wi=
ll, <b>analog to contextpr</b>.</div><div>This is both very efficient and i=
ntuitive if you think about it.</div><div>Another example might be helpful:=
</div><div><br></div><div style=3D"background-color:rgb(250,250,250);border=
-color:rgb(187,187,187);border-style:solid;border-width:1px;word-wrap:break=
-word"><code><div><span style=3D"color:#008">void</span><span style=3D"colo=
r:#000"> do_something</span><span style=3D"color:#660">(</span><span style=
=3D"color:#000"> std</span><span style=3D"color:#660">::</span><span style=
=3D"color:#000">vector</span><span style=3D"color:#660">&lt;</span><span st=
yle=3D"color:#606">Callable</span><span style=3D"color:#660">&gt;</span><sp=
an style=3D"color:#000"> vec </span><span style=3D"color:#660">){</span><sp=
an style=3D"color:#000"><br></span><span style=3D"color:#800">// ...</span>=
<span style=3D"color:#000"><br></span><span style=3D"color:#660">}</span><s=
pan style=3D"color:#000"><br><br>std</span><span style=3D"color:#660">::</s=
pan><span style=3D"color:#000">vector</span><span style=3D"color:#660">&lt;=
</span><span style=3D"color:#606">Callable</span><span style=3D"color:#660"=
>&gt;</span><span style=3D"color:#000"> foo1</span><span style=3D"color:#66=
0">;</span><span style=3D"color:#000"><br>std</span><span style=3D"color:#6=
60">::</span><span style=3D"color:#000">vector</span><span style=3D"color:#=
660">&lt;</span><span style=3D"color:#000">std</span><span style=3D"color:#=
660">::</span><span style=3D"color:#008">function</span><span style=3D"colo=
r:#660">&lt;</span><span style=3D"color:#008">void</span><span style=3D"col=
or:#660"><wbr>()&gt;&gt;</span><span style=3D"color:#000"> foo2</span><span=
 style=3D"color:#660">;</span><span style=3D"color:#000"><br><br>do_somethi=
ng</span><span style=3D"color:#660">(</span><span style=3D"color:#000"> foo=
1 </span><span style=3D"color:#660">);</span><span style=3D"color:#000"> </=
span><span style=3D"color:#800">// &#39;vec&#39; will stay a vector of type=
 erased Callables</span><span style=3D"color:#000"><br>do_something</span><=
span style=3D"color:#660">(</span><span style=3D"color:#000"> foo2 </span><=
span style=3D"color:#660">);</span><span style=3D"color:#000"> </span><span=
 style=3D"color:#800">// &#39;vec&#39; will be deduced to std::vector&lt;st=
d::function&lt;<wbr>void()&gt;&gt;</span><span style=3D"color:#000"><br></s=
pan></div></code></div><div><br></div>Again: Everything that can be deduced=
 at compile time will and everything that cannot will be deferred to run ti=
me.<div>Since this interpretation of concepts as implicit base classes only=
 happens in undeduced contexts (this is currently not allowed), its not bre=
aking code.</div><div><br></div><div>How &#39;bout that???</div><div><br></=
div><div>Cheers,</div><div>Jakob</div></div></blockquote></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/d832c461-fa3e-429e-a36b-1d0b11eb634f%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/d832c461-fa3e-429e-a36b-1d0b11eb634f=
%40isocpp.org</a>.<br />

------=_Part_759_1725561650.1494310215177--

------=_Part_758_274165352.1494310215176--

.
