220 7281 <CAPBZbvwo0CPhVC=zxeEgZESdBrH-jMcT3+yJNRYt_J9=zBEUUw@mail.gmail.com> article
Path: news.gmane.org!not-for-mail
From: "Billy O'Neal" <billy.oneal@gmail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Predynamic Storage Duration
Date: Sun, 13 Oct 2013 23:50:18 -0700
Lines: 405
Approved: news@gmane.org
Message-ID: <CAPBZbvwo0CPhVC=zxeEgZESdBrH-jMcT3+yJNRYt_J9=zBEUUw@mail.gmail.com>
References: <6fabf6ab-eb9b-42a1-b4a4-deacb2d30ba1@isocpp.org>
 <CAPBZbvyRGQTvOc63DP=SBwjX-yM+7125e7nekc=CdPz3m0fnyA@mail.gmail.com> <8b3bff2b-d0ce-4644-b753-deba2dea954a@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/alternative; boundary=089e01634ec2f1d81a04e8ade3c7
X-Trace: ger.gmane.org 1381733454 25651 80.91.229.3 (14 Oct 2013 06:50:54 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Mon, 14 Oct 2013 06:50:54 +0000 (UTC)
To: std-proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBDKLBLVE6ADBBUVI52JAKGQEPRDS55Y@isocpp.org Mon Oct 14 08:51:00 2013
Return-path: <std-proposals+bncBDKLBLVE6ADBBUVI52JAKGQEPRDS55Y@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-vb0-f71.google.com ([209.85.212.71])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBDKLBLVE6ADBBUVI52JAKGQEPRDS55Y@isocpp.org>)
	id 1VVbzX-00046z-NB
	for gclcip-std-proposals@m.gmane.org; Mon, 14 Oct 2013 08:50:59 +0200
Original-Received: by mail-vb0-f71.google.com with SMTP id g17sf13120299vbg.10
        for <gclcip-std-proposals@m.gmane.org>; Sun, 13 Oct 2013 23:50:58 -0700 (PDT)
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20130820;
        h=mime-version:in-reply-to:references:from:date:message-id:subject:to
         :x-original-sender:x-original-authentication-results:reply-to
         :precedence:mailing-list:list-id:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe:content-type;
        bh=AQKAHmC6ow4MJlMEbFrI/YmchnGMkVMTs9VSQ8EGuhY=;
        b=DHnEUJY+lcMupmQo8VDMEmAZylDuPx6h5HxxGDTGB9SZa2XYMf92iBjjW4XBV5Mp++
         FxQxKYGoBl+uwiIAw5LqoveytTnvomUBpLOzMzIibeYK/uLjMZZgSRkR9faAQYW36a0H
         oGdieCIRxj1tviQ5R1/SPBIRNSPmC0xS6u8bSGZBzO76wO3a6YCkMfny+zO57xsHZgLQ
         SxmYUsX795RM0seG6d0jTKfuPjAIzt6yyWpCOZ+sJFHJ0G/5yfR9N04007kSsBnDzaMB
         vMqocRuhYeuZc6G0PgBZfGGOJ1vtr0sQRaevyyqK6xFhQa3SKtsllWg2HjG28nPEQxx+
         9ZWA==
X-Received: by 10.236.94.39 with SMTP id m27mr154388yhf.54.1381733458919;
        Sun, 13 Oct 2013 23:50:58 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.182.131.138 with SMTP id om10ls658732obb.29.gmail; Sun, 13 Oct
 2013 23:50:58 -0700 (PDT)
X-Received: by 10.182.237.75 with SMTP id va11mr27193162obc.5.1381733458300;
        Sun, 13 Oct 2013 23:50:58 -0700 (PDT)
Original-Received: from mail-oa0-x235.google.com (mail-oa0-x235.google.com [2607:f8b0:4003:c02::235])
        by mx.google.com with ESMTPS id h5si31733710oed.14.1969.12.31.16.00.00
        (version=TLSv1 cipher=ECDHE-RSA-RC4-SHA bits=128/128);
        Sun, 13 Oct 2013 23:50:58 -0700 (PDT)
Received-SPF: pass (google.com: domain of billy.oneal@gmail.com designates 2607:f8b0:4003:c02::235 as permitted sender) client-ip=2607:f8b0:4003:c02::235;
Original-Received: by mail-oa0-f53.google.com with SMTP id i7so4211752oag.40
        for <std-proposals@isocpp.org>; Sun, 13 Oct 2013 23:50:58 -0700 (PDT)
X-Received: by 10.182.250.163 with SMTP id zd3mr27088866obc.20.1381733458104;
 Sun, 13 Oct 2013 23:50:58 -0700 (PDT)
Original-Received: by 10.182.87.37 with HTTP; Sun, 13 Oct 2013 23:50:18 -0700 (PDT)
In-Reply-To: <8b3bff2b-d0ce-4644-b753-deba2dea954a@isocpp.org>
X-Original-Sender: billy.oneal@gmail.com
X-Original-Authentication-Results: mx.google.com;       spf=pass (google.com:
 domain of billy.oneal@gmail.com designates 2607:f8b0:4003:c02::235 as
 permitted sender) smtp.mail=billy.oneal@gmail.com;       dkim=pass
 header.i=@gmail.com;       dmarc=pass (p=NONE dis=NONE) header.from=gmail.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: <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: <http://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:7281
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/7281>

--089e01634ec2f1d81a04e8ade3c7
Content-Type: text/plain; charset=ISO-8859-1

>The main use case would be enabling the use of strings, vectors and other
types that use dynamic storage as parameters, local variables and return
types of constexpr functions

Ok, I agree that's interesting. But your proposal started out with "I want
[code sample] to be as efficient as [code sample]."

Billy O'Neal
https://github.com/BillyONeal/ <https://bitbucket.org/BillyONeal/>
http://stackoverflow.com/users/82320/billy-oneal
Malware Response Instructor - BleepingComputer.com


On Sun, Oct 13, 2013 at 11:47 PM, Andrew Tomazos <andrewtomazos@gmail.com>wrote:

>
> On Monday, October 14, 2013 6:53:05 AM UTC+2, Billy O'Neal wrote:
>>
>> I can't think of a real world use case where this would have a
>> significant performance impact, and it adds significant complexity
>> penalties into the core language.
>>
>
> The main use case would be enabling the use of strings, vectors and other
> types that use dynamic storage as parameters, local variables and return
> types of constexpr functions.  Constexpr functions can be evaluated during
> translation from within a constant expression - so enable trading one unit
> of compile-time for at least n units of run-time, where n is the number of
> times the program is executed, for a net benefit of at least n-1 units of
> performance.
>
> The specific use cases of using strings and vectors in functions are too
> numerous to mention.  One example would be writing a character encoding
> transcoder.  Such a function may take a string in the input character
> encoding and return a string in the output character encoding and use a
> local vector object to hold an intermediate representation:
>
>     constexpr std::string transcode(const std::string& input)
>     {
>         std::vector<int> points;
>
>         for (char c : input)
>         {
>              ...
>              if (b)
>                  points.push_back(x);
>         }
>
>         std::string output;
>
>         for (int x : points)
>         {
>             if (...)
>                output += ...;
>         }
>
>         return output;
>     }
>
>     constexpr std::string s = transcode("foo");
>
> In the above transcode is called during translation and s is then
> constant-initialized.  It doesn't take much creativity to think of a whole
> host of other uses.
>    -Andrew.
>
>
> Billy O'Neal
>> https://github.com/BillyONeal/ <https://bitbucket.org/BillyONeal/>
>> http://stackoverflow.com/**users/82320/billy-oneal<http://stackoverflow.com/users/82320/billy-oneal>
>> Malware Response Instructor - BleepingComputer.com
>>
>>
>> On Sun, Oct 13, 2013 at 9:25 PM, Andrew Tomazos <andrew...@gmail.com>wrote:
>>
>>>  I want this:
>>>
>>>     std::string s = "foo";
>>>     std::vector<int> v = {1,2,3};
>>>
>>> to be as efficient as this:
>>>
>>>     char s[] = "foo";
>>>     int v[] = {1,2,3};
>>>
>>> and I want to write this:
>>>
>>>     constexpr std::vector<int> f(...)
>>>     {
>>>         std::vector<int> v;
>>>
>>>         for (...)
>>>         {
>>>              ...
>>>
>>>              v.push_back(v);
>>>         }
>>>
>>>         return v;
>>>     }
>>>
>>> Basically, I want std::string, std::vector and similar classes to be
>>> literal types.
>>>
>>> The main reason they cannot currently be literal types is because they
>>> need to allocate objects of dynamic storage duration, and the heap isn't
>>> available during translation.
>>>
>>> So here are the proposed changes:
>>>
>>> - Allow new expressions and delete expressions within constexpr
>>> functions (provided the operands are of literal type.)
>>>
>>> - A new expression evaluated within a constexpr function in
>>> constant-context returns a pointer to an object of predynamic storage
>>> duration
>>>
>>> - A delete expression evaluated within a constexpr function in
>>> constant-context deletes an object of predynamic storage duration
>>>
>>> - A delete expression evaluated at run-time deletes an object of either
>>> predynamic or dynamic storage duration
>>>
>>> Essentially, predynamic storage duration starts during translation and
>>> can end as late as run-time.
>>>
>>> During translation when evaluating a new expression within a constexpr
>>> function the implementation allocates the object within a memory pool
>>> (using whatever internal system it uses to hold variables of literal type)
>>> we'll call the preheap.  When encountering a delete expression in a
>>> constexpr function it deletes the operand from the preheap.  Any predynamic
>>> objects left over in the preheap after translation has completed are
>>> arranged into the program image in a .preheap section.  When the program
>>> loads the .preheap section is copied into memory and serves as part of the
>>> initial state of the run-time heap.
>>>
>>>     constexpr int* f()
>>>     {
>>>         int a[] = {1,2,3};
>>>
>>>         int* b = new int[3];  // predynamic object allocated during
>>> translation
>>>
>>>         for (size_t i = 0; i < 3; i++)
>>>             b[i] = a[i];
>>>
>>>         return b;
>>>      }
>>>
>>>      constexpr int* p = f(); // f called duration translation, returns
>>> pointer to predynamic object
>>>
>>>      int main()
>>>      {
>>>          delete p; // deletes predynamic object at runtime
>>>      }
>>>
>>> Feedback/thoughts appreciated.
>>>
>>>
>>>  --
>>>
>>> ---
>>> 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-proposal...@**isocpp.org.
>>> To post to this group, send email to std-pr...@isocpp.org.
>>>
>>> Visit this group at http://groups.google.com/a/**isocpp.org/group/std-**
>>> proposals/ <http://groups.google.com/a/isocpp.org/group/std-proposals/>.
>>>
>>
>>  --
>
> ---
> 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/.
>

-- 

--- 
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/.

--089e01634ec2f1d81a04e8ade3c7
Content-Type: text/html; charset=ISO-8859-1
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>&gt;The main use case would be enabling the use of st=
rings, vectors and other types that use dynamic storage as parameters, loca=
l variables and return types of constexpr functions</div><div>=A0</div><div=
>

Ok, I agree that&#39;s interesting. But your proposal started out with &quo=
t;I want [code sample] to be as efficient as [code sample].&quot;</div></di=
v><div class=3D"gmail_extra"><br clear=3D"all"><div><div dir=3D"ltr"><div>B=
illy O&#39;Neal</div>

<div><a href=3D"https://bitbucket.org/BillyONeal/" target=3D"_blank">https:=
//github.com/BillyONeal/</a></div><div><a href=3D"http://stackoverflow.com/=
users/82320/billy-oneal" target=3D"_blank">http://stackoverflow.com/users/8=
2320/billy-oneal</a></div>

<div>Malware Response Instructor - BleepingComputer.com</div></div></div>
<br><br><div class=3D"gmail_quote">On Sun, Oct 13, 2013 at 11:47 PM, Andrew=
 Tomazos <span dir=3D"ltr">&lt;<a href=3D"mailto:andrewtomazos@gmail.com" t=
arget=3D"_blank">andrewtomazos@gmail.com</a>&gt;</span> wrote:<br><blockquo=
te class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc so=
lid;padding-left:1ex">

<div dir=3D"ltr"><div class=3D"im"><br>On Monday, October 14, 2013 6:53:05 =
AM UTC+2, Billy O&#39;Neal wrote:<blockquote class=3D"gmail_quote" style=3D=
"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb(204,204,20=
4);border-left-width:1px;border-left-style:solid">

<div dir=3D"ltr">I
 can&#39;t think of a real world use case where this would have a=20
significant performance impact, and it adds significant complexity=20
penalties into the core language.</div></blockquote><br></div>The main use =
case would be enabling the use of strings, vectors and other types that use=
 dynamic storage as parameters, local variables and return types of constex=
pr functions.=A0 Constexpr functions can be evaluated during translation fr=
om within a constant expression - so enable trading one unit of compile-tim=
e for at least n units of run-time, where n is the number of times the prog=
ram is executed, for a net benefit of at least n-1 units of performance.<br=
>

<br>The specific use cases of using strings and vectors in functions are to=
o numerous to mention.=A0 One example would be writing a character encoding=
 transcoder.=A0 Such a function may take a string in the input character en=
coding and return a string in the output character encoding and use a local=
 vector object to hold an intermediate representation:<br>

<br>=A0=A0=A0 constexpr std::string transcode(const std::string&amp; input)=
<br>=A0=A0=A0 {<br>=A0=A0=A0=A0=A0=A0=A0 std::vector&lt;int&gt; points;<br>=
<br>=A0=A0=A0=A0=A0=A0=A0 for (char c : input)<br>=A0=A0=A0=A0=A0=A0=A0 {<b=
r>=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ...<br>=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0 if (b)<br>=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 points=
..push_back(x);<br>

=A0=A0=A0=A0=A0=A0=A0 }<br><br>=A0=A0=A0=A0=A0=A0=A0 std::string output;<br=
><br>=A0=A0=A0=A0=A0=A0=A0 for (int x : points)<br>=A0=A0=A0=A0=A0=A0=A0 {<=
br>=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 if (...)<br>=A0=A0=A0=A0=A0=A0=A0=A0=
=A0=A0=A0=A0=A0=A0 output +=3D ...;<br>=A0=A0=A0=A0=A0=A0=A0 }<br><br>=A0=
=A0=A0=A0=A0=A0=A0 return output;<br>=A0=A0=A0 }<br><br>=A0=A0=A0 constexpr=
 std::string s =3D transcode(&quot;foo&quot;);<br>

<br>In the above transcode is called during translation and s is then const=
ant-initialized.=A0 It doesn&#39;t take much creativity to think of a whole=
 host of other uses.<br>=A0=A0 -Andrew.<br><br><br clear=3D"all">

<blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;padding=
-left:1ex;border-left-color:rgb(204,204,204);border-left-width:1px;border-l=
eft-style:solid"><div><div class=3D"im"><div><div dir=3D"ltr"><div>Billy O&=
#39;Neal</div>

<div><a href=3D"https://bitbucket.org/BillyONeal/" target=3D"_blank">https:=
//github.com/BillyONeal/</a></div><div><a href=3D"http://stackoverflow.com/=
users/82320/billy-oneal" target=3D"_blank">http://stackoverflow.com/<u></u>=
users/82320/billy-oneal</a></div>



<div>Malware Response Instructor - BleepingComputer.com</div></div></div>
<br><br></div><div class=3D"gmail_quote"><div><div class=3D"h5">On Sun, Oct=
 13, 2013 at 9:25 PM, Andrew Tomazos <span dir=3D"ltr">&lt;<a>andrew...@gma=
il.com</a>&gt;</span> wrote:<br></div></div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;padding-left:1ex;border-left-color:rgb=
(204,204,204);border-left-width:1px;border-left-style:solid">

<div><div class=3D"h5">

<div dir=3D"ltr">I want this:<br><br>=A0=A0=A0 std::string s =3D &quot;foo&=
quot;;<br>=A0=A0=A0 std::vector&lt;int&gt; v =3D {1,2,3};<br><br>to be as e=
fficient as this:<br><br>=A0=A0=A0 char s[] =3D &quot;foo&quot;;<br>=A0=A0=
=A0 int v[] =3D {1,2,3};<br><br>



and I want to write this:<br><br>=A0=A0=A0 constexpr std::vector&lt;int&gt;=
 f(...)<br>=A0=A0=A0 {<br>=A0=A0=A0=A0=A0=A0=A0 std::vector&lt;int&gt; v;<b=
r><br>=A0=A0=A0=A0=A0=A0=A0 for (...)<br>=A0=A0=A0=A0=A0=A0=A0 {<br>=A0=A0=
=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0 ...<br><br>=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0 v.push_back(v);<br>


=A0=A0=A0=A0=A0=A0=A0 }<br>
<br>=A0=A0=A0=A0=A0=A0=A0 return v;<br>=A0=A0=A0 }<br><br>Basically, I want=
 std::string, std::vector and similar classes to be literal types.<br><br>T=
he main reason they cannot currently be literal types is because they need =
to allocate objects of dynamic storage duration, and the heap isn&#39;t ava=
ilable during translation.<br>



<br>So here are the proposed changes:<br><br>- Allow new expressions and de=
lete expressions within constexpr functions (provided the operands are of l=
iteral type.)<br><br>- A new expression evaluated within a constexpr functi=
on in constant-context returns a pointer to an object of predynamic storage=
 duration<br>



<br>- A delete expression evaluated within a constexpr function in constant=
-context deletes an object of predynamic storage duration<br><br>- A delete=
 expression evaluated at run-time deletes an object of either predynamic or=
 dynamic storage duration<br>



<br>Essentially, predynamic storage duration starts during translation and =
can end as late as run-time.<br><br>During translation when evaluating a ne=
w expression within a constexpr function the implementation allocates the o=
bject within a memory pool (using whatever internal system it uses to hold =
variables of literal type) we&#39;ll call the preheap.=A0 When encountering=
 a delete expression in a constexpr function it deletes the operand from th=
e preheap.=A0 Any predynamic objects left over in the preheap after transla=
tion has completed are arranged into the program image in a .preheap sectio=
n.=A0 When the program loads the .preheap section is copied into memory and=
 serves as part of the initial state of the run-time heap.<br>



<br>=A0=A0=A0 constexpr int* f()<br>=A0=A0=A0 {<br>=A0=A0=A0=A0=A0=A0=A0 in=
t a[] =3D {1,2,3};<br><br>=A0=A0=A0=A0=A0=A0=A0 int* b =3D new int[3];=A0 /=
/ predynamic object allocated during translation<br><br>=A0=A0=A0=A0=A0=A0=
=A0 for (size_t i =3D 0; i &lt; 3; i++)<br>=A0=A0=A0=A0=A0=A0=A0=A0=A0=A0=
=A0 b[i] =3D a[i];<br>



<br>=A0=A0=A0=A0=A0=A0=A0 return b;<br>=A0=A0=A0=A0 }<br><br>=A0=A0=A0=A0 c=
onstexpr int* p =3D f(); // f called duration translation, returns pointer =
to predynamic object<br><br>=A0=A0=A0=A0 int main()<br>=A0=A0=A0=A0 {<br>=
=A0=A0=A0=A0=A0=A0=A0=A0 delete p; // deletes predynamic object at runtime<=
br>



=A0=A0=A0=A0 }<br><br>Feedback/thoughts appreciated.<span><font color=3D"#8=
88888"><br><br><br></font></span></div></div></div><span><font color=3D"#88=
8888"><div><div class=3D"h5">

<p></p>

-- <br>
=A0<br>
--- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br></div></div>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a>std-proposal...@<u></u>isocpp.org</a>.<br>
To post to this group, send email to <a>std-pr...@isocpp.org</a>.<div class=
=3D"im"><br>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/<u></u>isocpp.=
org/group/std-<u></u>proposals/</a>.<br>
</div></font></span></blockquote></div><br></div>
</blockquote></div><div class=3D"HOEnZb"><div class=3D"h5">

<p></p>

-- <br>
=A0<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@isocpp.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>
Visit this group at <a href=3D"http://groups.google.com/a/isocpp.org/group/=
std-proposals/" target=3D"_blank">http://groups.google.com/a/isocpp.org/gro=
up/std-proposals/</a>.<br>
</div></div></blockquote></div><br></div>

<p></p>

-- <br />
&nbsp;<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 std-proposals+unsubscribe@isocpp.org.<br />
To post to this group, send email to std-proposals@isocpp.org.<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 />

--089e01634ec2f1d81a04e8ade3c7--

.
