220 10941 <dee48748-0dda-4085-97cd-b6e851deca55@isocpp.org> article
Path: news.gmane.org!not-for-mail
From: Diggory Blake <diggsey@googlemail.com>
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Protect Lambda functions against reflection
Date: Wed, 28 May 2014 16:14:23 -0700 (PDT)
Lines: 325
Approved: news@gmane.org
Message-ID: <dee48748-0dda-4085-97cd-b6e851deca55@isocpp.org>
References: <108c47a2-d952-4f84-a347-923b2ab742ad@isocpp.org>
 <CAFk2RUaPcXONmVug7-_t+imouCVQv9LQ3Hos-yRo=0X-HBQZKQ@mail.gmail.com>
 <CAB+4KHL3MvqYR3s=grM7t8imKHmnjj8s4PAYO01Z+rtq8sivnw@mail.gmail.com>
 <CAFk2RUasQdm4U+w393wqaD-J_6km+xOHhmd_sRyBx7ESy5Eyjw@mail.gmail.com>
 <CAB+4KH+eoF=PcS1pTg+neNA60bcbyZZXJsUenud4Md5RAk+MKw@mail.gmail.com>
 <CAFk2RUacOGaupA6+4JnYMt9ADv4vLOnXL6Ye4ef6crmOB7p78w@mail.gmail.com>
 <CAB+4KHJa1_OoQ5fevDztHYUJDz=uoW5BgzOAiNX19ArNyQhCvg@mail.gmail.com>
 <CAFk2RUbRbXCCETeD=PC3yCHJSigqiCqaCYM8NUx57tugnw4m7w@mail.gmail.com>
 <CANh-dXm+2BcZr-2mcoK_sjOnPgZoczN29A1ZBxQ5xvnOpnwL0A@mail.gmail.com>
 <CAB+4KHJJG=M7PbGJrconmROoOSJPt3hK7CpnD9BWYeSOrEUTXA@mail.gmail.com>
 <7ef3d3da-0c1d-443c-88d2-656b91937170@isocpp.org> <68f98b78-8bd4-48e0-9e1d-47cfc0492764@isocpp.org>
 <CAGg_6+MbbEPCW8mxyDDCZJhrhDKideb_UBvQ42De46w-WRGhjw@mail.gmail.com> <af9ceb0c-e51e-446e-8f56-bc58a2144896@isocpp.org>
 <CAGg_6+OHgQvWR3g+K1ShNESOefrmj1BaNQ6F5CXmnyEOiS01Zw@mail.gmail.com>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/alternative; 
	boundary="----=_Part_2713_32309209.1401318863986"
X-Trace: ger.gmane.org 1401318875 7586 80.91.229.3 (28 May 2014 23:14:35 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Wed, 28 May 2014 23:14:35 +0000 (UTC)
To: std-proposals@isocpp.org
Original-X-From: std-proposals+bncBC2MLAWQ6ANBBUO3TGOAKGQEBD2DWNY@isocpp.org Thu May 29 01:14:29 2014
Return-path: <std-proposals+bncBC2MLAWQ6ANBBUO3TGOAKGQEBD2DWNY@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-vc0-f197.google.com ([209.85.220.197])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBC2MLAWQ6ANBBUO3TGOAKGQEBD2DWNY@isocpp.org>)
	id 1Wpn3C-0004k4-Pr
	for gclcip-std-proposals@m.gmane.org; Thu, 29 May 2014 01:14:27 +0200
Original-Received: by mail-vc0-f197.google.com with SMTP id hy4sf6682119vcb.0
        for <gclcip-std-proposals@m.gmane.org>; Wed, 28 May 2014 16:14:25 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=googlemail.com; s=20120113;
        h=date:from:to:message-id:in-reply-to:references:subject:mime-version
         :x-original-sender:reply-to:precedence:mailing-list:list-id
         :list-post:list-help:list-archive:list-subscribe:list-unsubscribe
         :content-type;
        bh=y2KyXhJ7ZQhZdZ4eYt7FNu9IruvNDvxXek6W1PAErs0=;
        b=IasXpF+rNyYUdkrelqnAzPQJem02YGJOccMfzChH8QS79207vmfzjngfyAdnkPzQwY
         48joVQQFcaYgO0l/zrIVTiqD/h/fS/oGINDesU2s0LI8bqh4ZQ4T6aqjF2/On7GbN/WS
         F0p0n4ajHZ1ibu3x+F42gs66WHMnf8Apopjh0H1/oXKrYPP3uzne26VaqAkpMqpCOFXm
         HalquX0WE8bNMU2LcO3ykToKh2mK51AtvK83RzmeRW37CvUhefogx5FneYSF70P+PJNf
         p82tBiTA8sC+Ibo3Rn56SeCpmowCWNpWYjShrHQpYsMjwiauAoO7E0jZ+LHpyc41bO+T
         vgfg==
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:message-id:in-reply-to:references
         :subject:mime-version:x-original-sender:reply-to:precedence
         :mailing-list:list-id:list-post:list-help:list-archive
         :list-subscribe:list-unsubscribe:content-type;
        bh=y2KyXhJ7ZQhZdZ4eYt7FNu9IruvNDvxXek6W1PAErs0=;
        b=A5usENqp3V4T7wVv4C2Iesrpwn5yWm/nz5vyA65u1NZVeqpSSMhci7RIc1J/4ty7v3
         NBEFDJlEaNPfQxjfdJH/4fgOoINAbxGVG9ckpKB2/sP9HS9hDPZJYhWczCNpaWwujNuJ
         fc0mUuPexzv4qFO05RrTVbQTeeKACbH1PNyLrvkpGv3zraO5osQUqsMhqtNRUqBvEX9X
         2yRUy2qd7fEIYbyfPZUnvlVAuUjSgFWMxemjZSo1fcbTdeBfBsZKl3Q/1ZMCGXea6d/a
         MTFvxUmq+PVuXqwjuf95aHxXMH/dXCxB5BC/1yf9TE3L9PRC0M5yGP8VUYG3BLlMPHkg
         bKlQ==
X-Gm-Message-State: ALoCoQmdWzAfxF/xS8+VEQ38SxL1dEZ/9gMBUi3SaXb9+DgbkMZVqvj06XDhbWxmuZx8fyeyjmFR
X-Received: by 10.236.231.52 with SMTP id k50mr1234645yhq.52.1401318865704;
        Wed, 28 May 2014 16:14:25 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.140.102.180 with SMTP id w49ls333367qge.3.gmail; Wed, 28 May
 2014 16:14:24 -0700 (PDT)
X-Received: by 10.140.47.201 with SMTP id m67mr54280qga.29.1401318864770;
        Wed, 28 May 2014 16:14:24 -0700 (PDT)
In-Reply-To: <CAGg_6+OHgQvWR3g+K1ShNESOefrmj1BaNQ6F5CXmnyEOiS01Zw@mail.gmail.com>
X-Original-Sender: diggsey@googlemail.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:10941
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/10941>

------=_Part_2713_32309209.1401318863986
Content-Type: text/plain; charset=UTF-8



On Wednesday, 28 May 2014 23:18:02 UTC+1, Nevin ":-)" Liber wrote:
>
> On 28 May 2014 16:48, Diggory Blake <dig...@googlemail.com <javascript:>>wrote:
>
>>
>>
>> On Wednesday, 28 May 2014 22:18:24 UTC+1, Nevin ":-)" Liber wrote:
>>
>>> On 28 May 2014 15:38, Diggory Blake <dig...@googlemail.com> wrote:
>>>  
>>>> Also, access modifiers are not there for security reasons - it's 
>>>> trivial to bypass them if one really wanted to 
>>>>
>>>
>>> While there are a few places in the language where encapsulation is 
>>> broken (templated member functions, for instance), I don't think it is 
>>> trivial to bypass them in a *standard conforming* C++ program.  Could 
>>> you give us some simple examples?
>>>
>>
>> struct Foo {
>> public:
>>     int m_public;
>> private:
>>     int m_private;
>> };
>>
>> struct Bar {
>> public:
>>     int m_public;
>>     int m_private;
>> };
>>
>> void setPrivate(Foo* foo, int v) {
>>     ((Bar*)foo)->m_private = v;
>> }
>>
>>
> And you are asserting that is a legal, standards conforming C++ program?? 
>  Anything that generates undefined behavior is by definition not guaranteed 
> to generate the code you think it will generate.
>

No, but it does work in practically every C++ compiler ever.
 

>
> C++ allows direct memory access, of course it's trivial to bypass any kind 
>> of access control not enforced by the underlying operating system.
>>
>
> I'm not arguing this from a security perspective (that would be silly), 
> but from a language perspective.
>

And the same people who are going to try accessing private members are not 
going to give up because their code isn't 100% standards compliant, if it 
works they'll do it. If you impose restrictions they'll find a way around 
them, and in the process you annoy every sane programmer who actually knows 
what they're doing.
 

>  
>
>> Just because a program is using reflection to enumerate private members 
>> does not imply that it is relying on implementation detail.
>>
>
> If public/protected/private is ignored, how is reflection not exposing the 
> implementation details of the class?
>  
>
>> The program may be doing any number of tasks which the author of the 
>> class cannot possible have predicted, and the program may not require any 
>> kind of promise that the implementation will not change for it to succeed.
>>
>
> And if I make an implementation change, I can break any of those tasks. 
>  For exposed interface breaking changes, that's expected.  You want to add 
> that ability for *any* class change; that makes things very fragile.
>

Really, so if I make a library which uses reflection to generate debug 
information for a program you can break it by changing your implementation? 
No. In addition, there are cases where the class author simply cannot 
foresee a use. For example, what if I want to generate memory layout 
information for a garbage collector such as Boehm to more precisely scan 
the heap?
 

>  
>
>> If the programmer was the one supplying these arguments then it would be 
>> pointless. The only time it's useful is if the programmer doesn't know what 
>> the arguments should be (ie. they are determined by the program at either 
>> compile-time or run-time). Access control only mitigates human error, so 
>> using it to restrict what the program itself can do has no benefit.
>>
>
> Access control stops people from mucking with my invariants and relying on 
> a specific implementation.
>

Nope, it just tells them they shouldn't, and it will continue to do that 
even if it's possible to bypass it via reflection.
 

>  
>
>> -- 
>>
>  Nevin ":-)" Liber  <mailto:ne...@eviloverlord.com <javascript:>>  (847) 
> 691-1404 
>

-- 

--- 
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_2713_32309209.1401318863986
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Wednesday, 28 May 2014 23:18:02 UTC+1, Nevin ":=
-)" Liber  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">On 28 May 2014 16:48, Diggory Blake <span dir=3D"ltr">&lt;<a href=3D"ja=
vascript:" target=3D"_blank" gdf-obfuscated-mailto=3D"Cr2cnbPtWNoJ" onmouse=
down=3D"this.href=3D'javascript:';return true;" onclick=3D"this.href=3D'jav=
ascript:';return true;">dig...@googlemail.com</a>&gt;</span> wrote:<br><div=
><div class=3D"gmail_quote">

<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"><div dir=3D"ltr"><br><br>On Wednesday, 28 May 2014 22:18:2=
4 UTC+1, Nevin ":-)" Liber  wrote:<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;p=
adding-left:1ex"><div dir=3D"ltr">On 28 May 2014 15:38, Diggory Blake <span=
 dir=3D"ltr">&lt;<a>dig...@googlemail.com</a>&gt;</span> wrote:<br>

<div><div class=3D"gmail_quote">

<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"><div dir=3D"ltr">Also, access modifiers are not there for =
security reasons - it's trivial to bypass them if one really wanted to </di=
v>



</blockquote><div><br></div><div>While there are a few places in the langua=
ge where encapsulation is broken (templated member functions, for instance)=
, I don't think it is trivial to bypass them in a <i>standard conforming</i=
> C++ program. &nbsp;Could you give us some simple examples?</div>

</div></div></div></blockquote></div><div><br><div style=3D"background-colo=
r:rgb(250,250,250);border:1px solid rgb(187,187,187);word-wrap:break-word">=
<code><div><span style=3D"color:rgb(0,0,136)">struct</span><span style=3D"c=
olor:rgb(0,0,0)"> </span><span style=3D"color:rgb(102,0,102)">Foo</span><sp=
an style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(102,102,0)">=
{</span><span style=3D"color:rgb(0,0,0)"><br>

</span><span style=3D"color:rgb(0,0,136)">public</span><span style=3D"color=
:rgb(102,102,0)">:</span><span style=3D"color:rgb(0,0,0)"><br>&nbsp; &nbsp;=
 </span><span style=3D"color:rgb(0,0,136)">int</span><span style=3D"color:r=
gb(0,0,0)"> m_public</span><span style=3D"color:rgb(102,102,0)">;</span><sp=
an style=3D"color:rgb(0,0,0)"><br>

</span><span style=3D"color:rgb(0,0,136)">private</span><span style=3D"colo=
r:rgb(102,102,0)">:</span><span style=3D"color:rgb(0,0,0)"><br>&nbsp; &nbsp=
; </span><span style=3D"color:rgb(0,0,136)">int</span><span style=3D"color:=
rgb(0,0,0)"> m_private</span><span style=3D"color:rgb(102,102,0)">;</span><=
span style=3D"color:rgb(0,0,0)"><br>

</span><span style=3D"color:rgb(102,102,0)">};</span><span style=3D"color:r=
gb(0,0,0)"><br></span></div></code></div><br><div style=3D"background-color=
:rgb(250,250,250);border:1px solid rgb(187,187,187);word-wrap:break-word"><=
code><div>

<span style=3D"color:rgb(0,0,136)">struct</span><span style=3D"color:rgb(0,=
0,0)"> </span><span style=3D"color:rgb(102,0,102)">Bar</span><span style=3D=
"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(102,102,0)">{</span><sp=
an style=3D"color:rgb(0,0,0)"><br>

</span><span style=3D"color:rgb(0,0,136)">public</span><span style=3D"color=
:rgb(102,102,0)">:</span><span style=3D"color:rgb(0,0,0)"><br>&nbsp; &nbsp;=
 </span><span style=3D"color:rgb(0,0,136)">int</span><span style=3D"color:r=
gb(0,0,0)"> m_public</span><span style=3D"color:rgb(102,102,0)">;</span><sp=
an style=3D"color:rgb(0,0,0)"><br>

&nbsp; &nbsp; </span><span style=3D"color:rgb(0,0,136)">int</span><span sty=
le=3D"color:rgb(0,0,0)"> m_private</span><span style=3D"color:rgb(102,102,0=
)">;</span><span style=3D"color:rgb(0,0,0)"><br></span><span style=3D"color=
:rgb(102,102,0)">};</span><span style=3D"color:rgb(0,0,0)"><br>

<br></span><span style=3D"color:rgb(0,0,136)">void</span><span style=3D"col=
or:rgb(0,0,0)"> setPrivate</span><span style=3D"color:rgb(102,102,0)">(</sp=
an><span style=3D"color:rgb(102,0,102)">Foo</span><span style=3D"color:rgb(=
102,102,0)">*</span><span style=3D"color:rgb(0,0,0)"> foo</span><span style=
=3D"color:rgb(102,102,0)">,</span><span style=3D"color:rgb(0,0,0)"> </span>=
<span style=3D"color:rgb(0,0,136)">int</span><span style=3D"color:rgb(0,0,0=
)"> v</span><span style=3D"color:rgb(102,102,0)">)</span><span style=3D"col=
or:rgb(0,0,0)"> </span><span style=3D"color:rgb(102,102,0)">{</span><span s=
tyle=3D"color:rgb(0,0,0)"><br>

&nbsp; &nbsp; </span><span style=3D"color:rgb(102,102,0)">((</span><span st=
yle=3D"color:rgb(102,0,102)">Bar</span><span style=3D"color:rgb(102,102,0)"=
>*)</span><span style=3D"color:rgb(0,0,0)">foo</span><span style=3D"color:r=
gb(102,102,0)">)-&gt;</span><span style=3D"color:rgb(0,0,0)">m_private </sp=
an><span style=3D"color:rgb(102,102,0)">=3D</span><span style=3D"color:rgb(=
0,0,0)"> v</span><span style=3D"color:rgb(102,102,0)">;</span><span style=
=3D"color:rgb(0,0,0)"><br>

</span><span style=3D"color:rgb(102,102,0)">}</span><span style=3D"color:rg=
b(0,0,0)"><br></span></div></code></div><br></div></div></blockquote><div><=
br></div><div>And you are asserting that is a legal, standards conforming C=
++ program?? &nbsp;Anything that generates undefined behavior is by definit=
ion not guaranteed to generate the code you think it will generate.</div></=
div></div></div></blockquote><div><br>No, but it does work in practically e=
very C++ compiler ever.<br>&nbsp;</div><blockquote class=3D"gmail_quote" st=
yle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-lef=
t: 1ex;"><div dir=3D"ltr"><div><div class=3D"gmail_quote">

<div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0p=
x 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-lef=
t-style:solid;padding-left:1ex"><div dir=3D"ltr"><div>C++ allows direct mem=
ory access, of course it's trivial to bypass any kind of access control not=
 enforced by the underlying operating system.<br>

</div></div></blockquote><div><br></div><div>I'm not arguing this from a se=
curity perspective (that would be silly), but from a language perspective.<=
/div></div></div></div></blockquote><div><br>And the same people who are go=
ing to try accessing private members are not going to give up because their=
 code isn't 100% standards compliant, if it works they'll do it. If you imp=
ose restrictions they'll find a way around them, and in the process you ann=
oy every sane programmer who actually knows what they're doing.<br>&nbsp;</=
div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex=
;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><div=
 class=3D"gmail_quote"><div>&nbsp;</div><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rg=
b(204,204,204);border-left-style:solid;padding-left:1ex">

<div dir=3D"ltr"><div>Just because a program is using reflection to enumera=
te private members does not imply that it is relying on implementation deta=
il.</div></div></blockquote><div><br></div><div>If public/protected/private=
 is ignored, how is reflection not exposing the implementation details of t=
he class?</div>

<div>&nbsp;</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-l=
eft-style:solid;padding-left:1ex"><div dir=3D"ltr"><div> The program may be=
 doing any number of tasks which the author of the class cannot possible ha=
ve predicted, and the program may not require any kind of promise that the =
implementation will not change for it to succeed.<br>

</div></div></blockquote><div><br></div><div>And if I make an implementatio=
n change, I can break any of those tasks. &nbsp;For exposed interface break=
ing changes, that's expected. &nbsp;You want to add that ability for *any* =
class change; that makes things very fragile.</div></div></div></div></bloc=
kquote><div><br>Really, so if I make a library which uses reflection to gen=
erate debug information for a program you can break it by changing your imp=
lementation? No. In addition, there are cases where the class author simply=
 cannot foresee a use. For example, what if I want to generate memory layou=
t information for a garbage collector such as Boehm to more precisely scan =
the heap?<br>&nbsp;</div><blockquote class=3D"gmail_quote" style=3D"margin:=
 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div =
dir=3D"ltr"><div><div class=3D"gmail_quote">

<div>&nbsp;</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-l=
eft-style:solid;padding-left:1ex"><div dir=3D"ltr"><div>If the programmer w=
as the one supplying these arguments then it would be pointless. The only t=
ime it's useful is if the programmer doesn't know what the arguments should=
 be (ie. they are determined by the program at either compile-time or run-t=
ime). Access control only mitigates human error, so using it to restrict wh=
at the program itself can do has no benefit.</div>

</div></blockquote><div><br></div><div>Access control stops people from muc=
king with my invariants and relying on a specific implementation.</div></di=
v></div></div></blockquote><div><br>Nope, it just tells them they shouldn't=
, and it will continue to do that even if it's possible to bypass it via re=
flection.<br>&nbsp;</div><blockquote class=3D"gmail_quote" style=3D"margin:=
 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div =
dir=3D"ltr"><div><div class=3D"gmail_quote"><div>&nbsp;</div><blockquote cl=
ass=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:1e=
x">

<div dir=3D"ltr"><div>--&nbsp;<br></div></div></blockquote></div>&nbsp;Nevi=
n ":-)" Liber&nbsp; &lt;mailto:<a href=3D"javascript:" target=3D"_blank" gd=
f-obfuscated-mailto=3D"Cr2cnbPtWNoJ" onmousedown=3D"this.href=3D'javascript=
:';return true;" onclick=3D"this.href=3D'javascript:';return true;">ne...@e=
viloverlord.com</a><wbr>&gt;&nbsp; (847) 691-1404
</div></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_2713_32309209.1401318863986--

.
