220 21406 <a6ea2b35-2fe9-4a67-a980-a5c0ede95add@isocpp.org> article
Path: news.gmane.org!not-for-mail
From: german.diago@hubblehome.com
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Resumable expressions p0114r0 vs async/await P0057R0
Date: Wed, 7 Oct 2015 08:37:45 -0700 (PDT)
Lines: 382
Approved: news@gmane.org
Message-ID: <a6ea2b35-2fe9-4a67-a980-a5c0ede95add@isocpp.org>
References: <639f0012-8cb4-4db3-82a6-8d042a3497f9@isocpp.org>
 <401aa118-ed0b-4c7b-92cf-3fbd706eff9d@isocpp.org>
 <fcbcc1c4-535c-4fa2-a17d-4acffe84a4b5@isocpp.org>
 <1d15dbc4-e0c1-4df1-86db-014e11f14d26@isocpp.org>
 <1bf00a8f-5f20-43de-a319-2712ab34eafd@isocpp.org>
 <36f46c03-b1f1-4230-b686-a7a9a1c491cb@isocpp.org>
 <9e17f8a6-4f5b-47dd-9f76-a4675a5ede3c@isocpp.org>
 <c74e1892-2a61-46e3-a4ca-81255363b07e@isocpp.org>
 <1105ae90-7e2b-49be-b88e-84493c9a1810@isocpp.org>
 <9838dc2a-6f1b-4dca-b4b9-72b6a9917c38@isocpp.org>
 <b7796fea-ab43-4f19-945c-2579e775ffde@isocpp.org>
 <8067ed4f-3f08-41eb-b897-0760690fd55e@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_7595_1022848722.1444232265172"
X-Trace: ger.gmane.org 1444232269 27406 80.91.229.3 (7 Oct 2015 15:37:49 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Wed, 7 Oct 2015 15:37:49 +0000 (UTC)
Cc: german.diago@hubblehome.com
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBDKJVOEEVYNRBSPY2SYAKGQEKBOKQNQ@isocpp.org Wed Oct 07 17:37:48 2015
Return-path: <std-proposals+bncBDKJVOEEVYNRBSPY2SYAKGQEKBOKQNQ@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-ob0-f198.google.com ([209.85.214.198])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBDKJVOEEVYNRBSPY2SYAKGQEKBOKQNQ@isocpp.org>)
	id 1Zjqmp-0005YH-IZ
	for gclcip-std-proposals@m.gmane.org; Wed, 07 Oct 2015 17:37:47 +0200
Original-Received: by obbgf5 with SMTP id gf5sf30910104obb.3
        for <gclcip-std-proposals@m.gmane.org>; Wed, 07 Oct 2015 08:37:46 -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=bcwcAw+O2oZtRUIX8lmhO1qXDOLFbv84ON9p4/kxxm0=;
        b=dpdGQO2a+gn8JgrisDGZyxUjMO7EpNCdiT8N91W2QGCIcXh3Colchwt800bT98/Ui7
         /OmVNo0T6RMCk53rAyxQdEOu4LtDO81PtJG70Z3MpcAg1e7DpvNQuv0bR9kAUSL2kSZG
         YIFajKnKl2pS2gmRU1uYgheKSR6K9hg+WPoh1GyJLDnsz/xvqvuS1SAPwLNgPRtnDAIK
         sBlnESgP+rQAyJTUGmakhU+4lwQ0w4lQ0LzeMvF7e8hTYxc6cPK4sidxjWLJrGrn+ZZG
         fuAJXbJTNv/nQsfI8dHpZmac8pQo8ST2PKQyfdcF8hjF2Y/7rDQx/BMXWg3W3Sq3fUC2
         9b4Q==
X-Gm-Message-State: ALoCoQkEhw0grZ5TNk0V1B6EfEXNxXlWTwyOrtTQQN7+YFF5Nkhuwxb+V9G5W8IB/8apnaYgElgQ
X-Received: by 10.182.65.134 with SMTP id x6mr1412777obs.14.1444232266608;
        Wed, 07 Oct 2015 08:37:46 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.107.131.21 with SMTP id f21ls247447iod.24.gmail; Wed, 07 Oct
 2015 08:37:45 -0700 (PDT)
X-Received: by 10.50.66.205 with SMTP id h13mr321893igt.10.1444232265639;
        Wed, 07 Oct 2015 08:37:45 -0700 (PDT)
In-Reply-To: <8067ed4f-3f08-41eb-b897-0760690fd55e@isocpp.org>
X-Original-Sender: german.diago@hubblehome.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:21406
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/21406>

------=_Part_7595_1022848722.1444232265172
Content-Type: multipart/alternative; 
	boundary="----=_Part_7596_406258332.1444232265173"

------=_Part_7596_406258332.1444232265173
Content-Type: text/plain; charset=UTF-8



>
> Therefore, the only reason you would need to "put await 7 levels down the 
> stack" is if you want every function in that call graph to halt when the 
> top-most function does, and thus return control to the caller "7 levels 
> down". Correct?
>
> If so:
>  
>
>> For resumable, you would need to do it in the 7th level only, and you
>> would not need to refactor the rest of the code.
>>
>
> That's not true.
>

As I understood it, maybe I am wrong, the function will suspend inside.
 

>
> A function marked `resumable` can *only be called* from a resumable 
> context. This is either another function marked `resumable` or from an 
> expression marked `resumable`.
>
> So this is illegal:
>
> resumable int level3()
> {
>   return 5;
> }
>
> int level2()
> {
>   return level3(); //Cannot call a resumeable function here.
> }
>
> Therefore, *every one of those 7 levels* is going to have to be a 
> `resumable` function. So every one of those levels will have to mark their 
> signature with `resumable`. Any code that calls into any one of those 7 
> levels will have to mark each use of them with `resumable`, or will 
> themselves have to be coroutines.
>
>  

> So yes, it's just as viral. Only it's worse, because not only do you have 
> to mark them `resumable`, they *must be inline*.
>
> I am not sure about this limitation. I will take a look again.

 

> The only saving grace you get is that the proposal allows automatic 
> deduction of resumeable functions. But not everywhere; only in template 
> code and lambdas. So normal functions don't provide this feature.
>

Now I understand why it works. I did not catch this at first.
 

>
> That is 7 vs 1 refactoring. Needless to say the reusability problem that 
>> Chris exposes in the paper: you cannot reuse algorithms, for example, 
>>
> with await.
>>
>
> That helps demonstrate the viral nature of resumable expressions. If I 
> call an algorithm that internally does an implicitly resumable operation, 
> then that algorithm internally becomes a coroutine. It becomes resumable.
>

Yes. True. Though, still more reusable than await in this regard.
 

>
> Which means... I now *must* call that algorithm instantiation from a 
> resumable context. So either my function itself is `resumable`, or I have 
> to say `resumable for_each(...)`.
>
> This doesn't invalidate your point, namely that algorithms will deduce how 
> to properly be `resumable` for their contents. The exact suspend/resume 
> points will not be defined by the writer of the algorithm, but by the 
> functions the algorithm actually calls. And there is value to that.
>

Agree.
 

>
> At this point, that is basically the only advantage of resumable 
> expressions. It's a non-trivial thing to be sure, but I don't see anything 
> about resumable functions that would prevent you from addressing these 
> concerns there.
>
> What resumable functions lack relative to resumable expressions are two 
> things:
>
> 1) A way for a function to effectively force the caller to become a 
> coroutine (implicit await).
>
> 2) A way for the caller of a function to *reverse* the implicit `await` 
> of a function call (that's what `resumable` applied to expressions does).
>
> These features are all it takes to allow for the kind of template code 
> reuse you're talking about. Though it does make it slightly more 
> inconvenient than the resumable expressions model, since RE coroutines 
> don't have return type requirements.
>

 

> But neither of these is *impossible* with the resumable functions model. 
> It's simply a matter of finding the best way to add those features in.
>

Would be nice to have those.
 

>
> And of deciding if we want them at all (that's not necessarily a given).
>
> You cannot have member variables with await either, right?
>>
>
I mean a member variable that holds a resumable expression, you can have 
that, it is a function object.
Can this be done with resumable functions? As far as I understand, but 
again, you seem
to understand the proposal better than me, you can only store the result, 
but not the object itself.

 

>
> I don't know what you mean by this.
>  
>
>> These are all tangible benefits from having a function object as a 
>> representation.
>>
>
> If you have a function object, we understand how to save it, reified 
(non-type erased) and how to extend that to
a copyable, movable object when it makes sense. That is what I meant.
 

> ... huh? Those benefits have nothing to do with "having a function object 
> as a representation." Those benefits come from having to declare whether a 
> function is a coroutine at the function level, rather than in the 
> function's implementation.
>
 

> Code reuse in template functions, perhaps. Code reuse elsewhere? Not so 
> much.
>

All the STL is not a small thing to dismiss... Not to mention all the 
template libs there are in the wild.
 

Yes, you could implement resumable functions on top of resumable 
> expressions. But that doesn't prove resumable expressions are better. Not 
> does it prove that anything you could build atop resumable expressions 
> cannot also be built atop resumable functions.
>

Maybe it is me only, but I find resumable expressions so easy to translate, 
in my head, to what it really is.
I cannot say the same about await. It has its merits also, sure, but 
resumable expressions seem simpler to me,
and everything else seems to be composable on top of it.
 

Can you tell me that resumable expressions have anywhere *near* the field 
> experience?
>

 Well, the closest thing we can have is creating function objects with 
stackless 
coroutines: http://www.boost.org/doc/libs/1_59_0/doc/html/boost_asio/overview/core/coroutine.html

That is a function object with resumable feature. I think what a resumable 
expression does can fit in my head
the same way a lambda fits.
I cannot say the same when I reason about await. At least not so easily. 
And I am still not convinced about
cannot hold it as an object (am I right?) you can only get its result, and 
the fact that you must type-erase it
(sure, there are optimizations for that, but for now they are in MS 
compiler only?).

Thank you very much for your feedback, it made me understand a few points I 
was wrong about.
 

-- 

--- 
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_7596_406258332.1444232265173
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div><br>=
Therefore, the only reason you would need to &quot;put await 7 levels down =
the stack&quot; is if you want every function in that call graph to halt wh=
en the top-most function does, and thus return control to the caller &quot;=
7 levels down&quot;. Correct?<br><br>If so:<br>=C2=A0</div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc =
solid;padding-left:1ex"><div>For resumable, you would need to do it in the =
7th level only, and you<br>would not need to refactor the rest of the code.=
</div></blockquote><div><br>That&#39;s not true.<br></div></blockquote><div=
><br></div><div>As I understood it, maybe I am wrong, the function will sus=
pend inside.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div><br>A function marked `resumable` can <i>only be called</i> from=
 a resumable context. This is either another function marked `resumable` or=
 from an expression marked `resumable`.<br><br>So this is illegal:<br><br><=
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><spa=
n style=3D"color:#000">resumable </span><span style=3D"color:#008">int</spa=
n><span style=3D"color:#000"> level3</span><span style=3D"color:#660">()</s=
pan><span style=3D"color:#000"><br></span><span style=3D"color:#660">{</spa=
n><span style=3D"color:#000"><br>=C2=A0 </span><span style=3D"color:#008">r=
eturn</span><span style=3D"color:#000"> </span><span style=3D"color:#066">5=
</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"><br><br>=
</span><span style=3D"color:#008">int</span><span style=3D"color:#000"> lev=
el2</span><span style=3D"color:#660">()</span><span style=3D"color:#000"><b=
r></span><span style=3D"color:#660">{</span><span style=3D"color:#000"><br>=
=C2=A0 </span><span style=3D"color:#008">return</span><span style=3D"color:=
#000"> level3</span><span style=3D"color:#660">();</span><span style=3D"col=
or:#000"> </span><span style=3D"color:#800">//Cannot call a resumeable func=
tion here.</span><span style=3D"color:#000"><br></span><span style=3D"color=
:#660">}</span><span style=3D"color:#000"><br></span></div></code></div><br=
>Therefore, <i>every one of those 7 levels</i> is going to have to be a `re=
sumable` function. So every one of those levels will have to mark their sig=
nature with `resumable`. Any code that calls into any one of those 7 levels=
 will have to mark each use of them with `resumable`, or will themselves ha=
ve to be coroutines.<br><br></div></blockquote><div>=C2=A0</div><blockquote=
 class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1=
px #ccc solid;padding-left: 1ex;"><div>So yes, it&#39;s just as viral. Only=
 it&#39;s worse, because not only do you have to mark them `resumable`, the=
y <i>must be inline</i>.<br><br></div></blockquote><div>I am not sure about=
 this limitation. I will take a look again.</div><div><br></div><div>=C2=A0=
</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8=
ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div>The only saving gra=
ce you get is that the proposal allows automatic deduction of resumeable fu=
nctions. But not everywhere; only in template code and lambdas. So normal f=
unctions don&#39;t provide this feature.<br></div></blockquote><div><br></d=
iv><div>Now I understand why it works. I did not catch this at first.</div>=
<div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div><br></di=
v><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bor=
der-left:1px #ccc solid;padding-left:1ex"><div>That is 7 vs 1 refactoring. =
Needless to say the reusability problem that Chris exposes in the paper: yo=
u cannot reuse algorithms, for example,=C2=A0</div></blockquote><blockquote=
 class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px =
#ccc solid;padding-left:1ex"><div>with await.</div></blockquote><div><br>Th=
at helps demonstrate the viral nature of resumable expressions. If I call a=
n algorithm that internally does an implicitly resumable operation, then th=
at algorithm internally becomes a coroutine. It becomes resumable.<br></div=
></blockquote><div><br></div><div>Yes. True. Though, still more reusable th=
an await in this regard.</div><div>=C2=A0</div><blockquote class=3D"gmail_q=
uote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;pad=
ding-left: 1ex;"><div><br>Which means... I now <i>must</i> call that algori=
thm instantiation from a resumable context. So either my function itself is=
 `resumable`, or I have to say `resumable for_each(...)`.<br><br>This doesn=
&#39;t invalidate your point, namely that algorithms will deduce how to pro=
perly be `resumable` for their contents. The exact suspend/resume points wi=
ll not be defined by the writer of the algorithm, but by the functions the =
algorithm actually calls. And there is value to that.<br></div></blockquote=
><div><br></div><div>Agree.</div><div>=C2=A0</div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;"><div><br>At this point, that is basically the only adva=
ntage of resumable expressions. It&#39;s a non-trivial thing to be sure, bu=
t I don&#39;t see anything about resumable functions that would prevent you=
 from addressing these concerns there.<br><br>What resumable functions lack=
 relative to resumable expressions are two things:<br><br>1) A way for a fu=
nction to effectively force the caller to become a coroutine (implicit awai=
t).<br><br>2) A way for the caller of a function to <i>reverse</i> the impl=
icit `await` of a function call (that&#39;s what `resumable` applied to exp=
ressions does).<br><br>These features are all it takes to allow for the kin=
d of template code reuse you&#39;re talking about. Though it does make it s=
lightly more inconvenient than the resumable expressions model, since RE co=
routines don&#39;t have return type requirements.<br></div></blockquote><di=
v><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"mar=
gin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><=
div>But neither of these is <i>impossible</i> with the resumable functions =
model. It&#39;s simply a matter of finding the best way to add those featur=
es in.<br></div></blockquote><div><br></div><div>Would be nice to have thos=
e.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:=
 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div>=
<br>And of deciding if we want them at all (that&#39;s not necessarily a gi=
ven).<br><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0;marg=
in-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div>You cannot =
have member variables with await either, right?</div></blockquote></blockqu=
ote><div><br></div><div>I mean a member variable that holds a resumable exp=
ression, you can have that, it is a function object.</div><div>Can this be =
done with resumable functions? As far as I understand, but again, you seem<=
/div><div>to understand the proposal better than me, you can only store the=
 result, but not the object itself.</div><div><br></div><div>=C2=A0</div><b=
lockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;borde=
r-left: 1px #ccc solid;padding-left: 1ex;"><div><br>I don&#39;t know what y=
ou mean by this.<br>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"=
margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><di=
v>These are all tangible benefits from having a function object as a repres=
entation.</div></blockquote><div><br></div></blockquote><div>If you have a =
function object, we understand how to save it, reified (non-type erased) an=
d how to extend that to</div><div>a copyable, movable object when it makes =
sense. That is what I meant.</div><div>=C2=A0</div><blockquote class=3D"gma=
il_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid=
;padding-left: 1ex;"><div>... huh? Those benefits have nothing to do with &=
quot;having a function object as a representation.&quot; Those benefits com=
e from having to declare whether a function is a coroutine at the function =
level, rather than in the function&#39;s implementation.<br></div></blockqu=
ote><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div></di=
v><div>Code reuse in template functions, perhaps. Code reuse elsewhere? Not=
 so much.</div></blockquote><div><br></div><div>All the STL is not a small =
thing to dismiss... Not to mention all the template libs there are in the w=
ild.</div><div>=C2=A0</div><div><br></div><blockquote class=3D"gmail_quote"=
 style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-=
left: 1ex;"><div>Yes, you could implement resumable functions on top of res=
umable expressions. But that doesn&#39;t prove resumable expressions are be=
tter. Not does it prove that anything you could build atop resumable expres=
sions cannot also be built atop resumable functions.<br></div></blockquote>=
<div><br></div><div>Maybe it is me only, but I find resumable expressions s=
o easy to translate, in my head, to what it really is.</div><div>I cannot s=
ay the same about await. It has its merits also, sure, but resumable expres=
sions seem simpler to me,</div><div>and everything else seems to be composa=
ble on top of it.</div><div>=C2=A0</div><div><br></div><blockquote class=3D=
"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc s=
olid;padding-left: 1ex;"><div>Can you tell me that resumable expressions ha=
ve anywhere <i>near</i> the field experience?</div></blockquote><div><br></=
div><div>=C2=A0Well, the closest thing we can have is creating function obj=
ects with stackless coroutines:=C2=A0http://www.boost.org/doc/libs/1_59_0/d=
oc/html/boost_asio/overview/core/coroutine.html</div><div><br></div><div>Th=
at is a function object with resumable feature. I think what a resumable ex=
pression does can fit in my head</div><div>the same way a lambda fits.</div=
><div>I cannot say the same when I reason about await. At least not so easi=
ly. And I am still not convinced about</div><div>cannot hold it as an objec=
t (am I right?) you can only get its result, and the fact that you must typ=
e-erase it</div><div>(sure, there are optimizations for that, but for now t=
hey are in MS compiler only?).</div><div><br></div><div>Thank you very much=
 for your feedback, it made me understand a few points I was wrong about.</=
div><div>=C2=A0</div></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_7596_406258332.1444232265173--
------=_Part_7595_1022848722.1444232265172--

.
