220 26517 <633216ff-c3df-4d6f-b33f-3457c87c7996@isocpp.org> article
Path: news.gmane.org!not-for-mail
From: pohilets@gmail.com
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: Pointer casts with move semantics
Date: Fri, 1 Jul 2016 03:50:49 -0700 (PDT)
Lines: 300
Approved: news@gmane.org
Message-ID: <633216ff-c3df-4d6f-b33f-3457c87c7996@isocpp.org>
References: <7c02ff86-424d-48aa-bd5e-a2f768bd5484@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: plane.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_267_1398178785.1467370249386"
X-Trace: ger.gmane.org 1467370269 20452 80.91.229.3 (1 Jul 2016 10:51:09 GMT)
X-Complaints-To: usenet@ger.gmane.org
NNTP-Posting-Date: Fri, 1 Jul 2016 10:51:09 +0000 (UTC)
Cc: pohilets@gmail.com
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBDT6TQHDA4IIVFWZXMCRUBEEZWD6U@isocpp.org Fri Jul 01 12:50:54 2016
Return-path: <std-proposals+bncBDT6TQHDA4IIVFWZXMCRUBEEZWD6U@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-vk0-f71.google.com ([209.85.213.71])
	by plane.gmane.org with esmtp (Exim 4.69)
	(envelope-from <std-proposals+bncBDT6TQHDA4IIVFWZXMCRUBEEZWD6U@isocpp.org>)
	id 1bIw28-0005uG-V7
	for gclcip-std-proposals@m.gmane.org; Fri, 01 Jul 2016 12:50:53 +0200
Original-Received: by mail-vk0-f71.google.com with SMTP id v6sf272246770vkb.2
        for <gclcip-std-proposals@m.gmane.org>; Fri, 01 Jul 2016 03:50:52 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=date:from:to:cc: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=4MGxTc69QI/ZDxazprRU8wUTh0sspNy0OQ4cHS5MAGI=;
        b=u5ybKTrzZw6l4TIlAy0cUT4/ypEhMGMPKQT6wTUN/9WT6YOwzbpkBFK9zlE3CVKeZy
         30ORdZwggzmcwRXwjdWoQWEpkhgvgygCd2Pe7Diud9VRSUrY8O8EptIv/kPAy1sRTMuQ
         qEe4+zImTJLa9fzr1TXD/CumImiy35mmyRTqnSfUtaZRRv7dv1Tqa9mgkMeu1IsFk556
         iouEpWv+1CT8yCPr/hy3d7kLoLkLHZvZpaUHcp0pSXwsiq6KY2N45yANLt/A5zfRVJIh
         jioWJloO6YWuYCOahRQqqFBesRv60HNfHKxH1VmFdGIK6/ovSjRk2SYoEReRA0ojy+2B
         PkNw==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20120113;
        h=date:from:to:cc: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=4MGxTc69QI/ZDxazprRU8wUTh0sspNy0OQ4cHS5MAGI=;
        b=M3M1CVqlYowOaP8pll12pAv8/xFkSV0kVUCkt14nNl4SdV0L/VyyYxsfwEggjKHCzU
         t0VJ7A81F9taJTMP7U8EZBpnvpz9gBVH/OGWemz3oaBX5v/suOxzpzgssmUBBkKqJ/OF
         E1aqFnMjDShyz9GQ3Rm60+49dUxEJYV0wGfOZTudtzojQEa/TfuC8nP73W/2CJ71GAy+
         5hv7AWi+xvOjK3dq86oqweEjXB7jNVvrP69bfoXTafjmJZQqlUfh49WOKH1UAGNlDkVP
         qzmJ4UcxRpK4DLXew+yx9X59jTfgz6wODwfzQNZPZrn5yZEch/B5Wu1omGD4Lmrlw5bB
         PfKQ==
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: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=4MGxTc69QI/ZDxazprRU8wUTh0sspNy0OQ4cHS5MAGI=;
        b=Zpb5qNms677Qer00VWQ+YuXZ+UmdoHcoT7NRh4tBksqoZ/XKIxqXVOjAamH6s4eqhV
         WIsSwknlV48vopWK86yiedlXuYiH7j148qXrYon8vRZudI50siknxlr8rf49NWbndxGj
         hPElrv3ppclxURWaLIQsx6R9xAQ1b4irrtQoigxPnVeeT3OGhzWx/G70i/o3TqKNM56A
         /5+5mUwB7XZpX2rpyfomlPdP7+hex1PkSDwI7vCJRmqVaQI2ZJST9T+oOB5V+429Nawa
         JFXkZESkkuQGsTRWP9RTjC1Bf7xS6p/odjBDthk03pKew5YXXGVEWErwtZEssXc+CXwN
         XjWQ==
X-Gm-Message-State: ALyK8tLGdPw5r2RRbeab/WGM8dWhRZiLZU7WZy9M9NCM99ncP2lVdz9NXdMmRejC6oEmPQ==
X-Received: by 10.237.57.70 with SMTP id l64mr16403412qte.5.1467370251935;
        Fri, 01 Jul 2016 03:50:51 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 10.107.137.82 with SMTP id l79ls245663iod.74.gmail; Fri, 01 Jul
 2016 03:50:50 -0700 (PDT)
X-Received: by 10.36.87.213 with SMTP id u204mr524710ita.10.1467370250526;
        Fri, 01 Jul 2016 03:50:50 -0700 (PDT)
In-Reply-To: <7c02ff86-424d-48aa-bd5e-a2f768bd5484@isocpp.org>
X-Original-Sender: pohilets@gmail.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: <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:26517
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/26517>

------=_Part_267_1398178785.1467370249386
Content-Type: multipart/alternative; 
	boundary="----=_Part_268_874370203.1467370249387"

------=_Part_268_874370203.1467370249387
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Submitted as P0390R0. Should be published in the next mailing

=D1=81=D1=83=D0=B1=D0=BE=D1=82=D0=B0, 21 =D1=82=D1=80=D0=B0=D0=B2=D0=BD=D1=
=8F 2016 =D1=80. 19:19:59 UTC+2 =D0=BA=D0=BE=D1=80=D0=B8=D1=81=D1=82=D1=83=
=D0=B2=D0=B0=D1=87 pohi...@gmail.com=20
=D0=BD=D0=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=B2:
>
> Recently I was optimizing reference counting in a tight loop, and was=20
> surprised to discover that all pointer cast functions take their argument=
=20
> by const reference and there are no versions that would take argument by=
=20
> value or by rvalue reference. As a result, the following code makes a=20
> completely unnecessary atomic increment and decrement:
>
>    struct Foo {};
>
>    struct Bar : public Foo {};
>
>    std::shared_ptr<Foo> foo();
>
>    auto bar =3D std::static_pointer_cast<Bar>(foo());
>
>
> An obvious solution would be add versions that take parameter by rvalue=
=20
> reference:
>
>
> template<class T, class U> std::shared_ptr<T> static_pointer_cast(const=
=20
> std::shared_ptr<U>& r);      // since C++11
>
> template<class T, class U> std::shared_ptr<T> dynamic_pointer_cast(const=
=20
> std::shared_ptr<U>& r);     // since C++11
>
> template<class T, class U> std::shared_ptr<T> const_pointer_cast(const st=
d
> ::shared_ptr<U>& r);       // since C++11
>
> template<class T, class U> std::shared_ptr<T> reinterpret_pointer_cast(
> const std::shared_ptr<U>& r); // since C++17
>
>
> template<class T, class U> std::shared_ptr<T> static_pointer_cast(std::
> shared_ptr<U>&& r);      // proposed addition
>
> template<class T, class U> std::shared_ptr<T> dynamic_pointer_cast(std::
> shared_ptr<U>&& r);     // proposed addition
>
> template<class T, class U> std::shared_ptr<T> const_pointer_cast(std::
> shared_ptr<U>&& r);       // proposed addition
>
> template<class T, class U> std::shared_ptr<T> reinterpret_pointer_cast(st=
d
> ::shared_ptr<U>&& r); // proposed addition
>
>
> Or just have a single version of each function, that takes argument by=20
> value:
>
>
> template<class T, class U> std::shared_ptr<T> static_pointer_cast(std::
> shared_ptr<U> r);      // proposed replacement
>
> template<class T, class U> std::shared_ptr<T> dynamic_pointer_cast(std::
> shared_ptr<U> r);     // proposed replacement
>
> template<class T, class U> std::shared_ptr<T> const_pointer_cast(std::
> shared_ptr<U> r);       // proposed replacement
>
> template<class T, class U> std::shared_ptr<T> reinterpret_pointer_cast(st=
d
> ::shared_ptr<U> r); // proposed replacement
>
>
> The later makes a redundant increment/decrement in one case: when doing=
=20
> dynamic_pointer_cast on a l-value and cast fails
>
>
>
>

--=20
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 e=
mail 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/633216ff-c3df-4d6f-b33f-3457c87c7996%40isocpp.or=
g.

------=_Part_268_874370203.1467370249387
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Submitted as=C2=A0P0390R0. Should be published in the next=
 mailing<div><div><div><br>=D1=81=D1=83=D0=B1=D0=BE=D1=82=D0=B0, 21 =D1=82=
=D1=80=D0=B0=D0=B2=D0=BD=D1=8F 2016 =D1=80. 19:19:59 UTC+2 =D0=BA=D0=BE=D1=
=80=D0=B8=D1=81=D1=82=D1=83=D0=B2=D0=B0=D1=87 pohi...@gmail.com =D0=BD=D0=
=B0=D0=BF=D0=B8=D1=81=D0=B0=D0=B2:<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">Recently I was optimizing reference counting in a ti=
ght loop, and was surprised to discover that all pointer cast functions tak=
e their argument by const reference and there are no versions that would ta=
ke argument by value or by rvalue reference. As a result, the following cod=
e makes a completely unnecessary atomic increment and decrement:<div><p sty=
le=3D"font-size:11px;line-height:normal;font-family:Menlo"><span style=3D"c=
olor:#bb2ca2">=C2=A0 =C2=A0struct</span><span> Foo {};</span></p>
<p style=3D"font-size:11px;line-height:normal;font-family:Menlo"><span styl=
e=3D"color:#bb2ca2">=C2=A0 =C2=A0struct</span><span> Bar : </span><span sty=
le=3D"color:#bb2ca2">public</span><span> </span><span style=3D"color:#4f818=
7">Foo</span><span> {};</span></p>
<p style=3D"font-size:11px;line-height:normal;font-family:Menlo;color:rgb(1=
12,61,170)"><span><span style=3D"color:rgb(187,44,162)">=C2=A0 =C2=A0</span=
>std</span><span style=3D"color:#000000">::</span><span>shared_ptr</span><s=
pan style=3D"color:#000000">&lt;</span><span style=3D"color:#4f8187">Foo</s=
pan><span style=3D"color:#000000">&gt; foo();</span></p>
<p style=3D"font-size:11px;line-height:normal;font-family:Menlo;color:rgb(6=
1,29,129)"><span style=3D"color:#bb2ca2">=C2=A0 =C2=A0auto</span><span styl=
e=3D"color:#000000"> bar =3D </span><span style=3D"color:#703daa">std</span=
><span style=3D"color:#000000">::</span><span>static_pointer_cast</span><sp=
an style=3D"color:#000000">&lt;</span><span style=3D"color:#4f8187">Bar</sp=
an><span style=3D"color:#000000">&gt;(</span><span style=3D"color:#31595d">=
<wbr>foo</span><span style=3D"color:#000000">());</span></p><p style=3D"fon=
t-size:11px;line-height:normal;font-family:Menlo;color:rgb(61,29,129)"><spa=
n style=3D"color:#000000"><br></span></p><p style=3D"font-size:11px;line-he=
ight:normal;font-family:Menlo"><span style=3D"font-family:Arial,Helvetica,s=
ans-serif;font-size:13px">An obvious solution would be add versions that ta=
ke parameter by rvalue reference</span><span style=3D"font-family:Arial,Hel=
vetica,sans-serif;font-size:13px">:</span></p><p style=3D"font-size:11px;li=
ne-height:normal;font-family:Menlo"><span style=3D"font-family:Arial,Helvet=
ica,sans-serif;font-size:13px"><br></span></p><p style=3D"font-size:11px;li=
ne-height:normal;font-family:Menlo"><span style=3D"color:#bb2ca2">template<=
/span><span>&lt;</span><span style=3D"color:#bb2ca2">class</span><span> T, =
</span><span style=3D"color:#bb2ca2">class</span><span> U&gt; </span><span =
style=3D"color:#703daa">std</span><span>::</span><span style=3D"color:#703d=
aa">shared_ptr</span><span>&lt;T&gt; static_pointer_cast(</span><span style=
=3D"color:#bb2ca2">const</span><span> </span><span style=3D"color:#703daa">=
std</span><span>::</span><span style=3D"color:#703daa">shared_ptr</span><sp=
an>&lt;U&gt;&amp; r);=C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#0084=
00">// since C++11</span></p><p style=3D"font-size:11px;line-height:normal;=
font-family:Menlo"><span style=3D"color:#bb2ca2">template</span><span>&lt;<=
/span><span style=3D"color:#bb2ca2">class</span><span> T, </span><span styl=
e=3D"color:#bb2ca2">class</span><span> U&gt; </span><span style=3D"color:#7=
03daa">std</span><span>::</span><span style=3D"color:#703daa">shared_ptr</s=
pan><span>&lt;T&gt; dynamic_pointer_cast(</span><span style=3D"color:#bb2ca=
2">const</span><span> </span><span style=3D"color:#703daa">std</span><span>=
::</span><span style=3D"color:#703daa">shared_ptr</span><span>&lt;U&gt;&amp=
; r); =C2=A0 =C2=A0 </span><span style=3D"color:#008400">// since C++11</sp=
an></p><p style=3D"font-size:11px;line-height:normal;font-family:Menlo"><sp=
an style=3D"color:#bb2ca2">template</span><span>&lt;</span><span style=3D"c=
olor:#bb2ca2">class</span><span> T, </span><span style=3D"color:#bb2ca2">cl=
ass</span><span> U&gt; </span><span style=3D"color:#703daa">std</span><span=
>::</span><span style=3D"color:#703daa">shared_ptr</span><span>&lt;T&gt; co=
nst_pointer_cast(</span><span style=3D"color:#bb2ca2">const</span><span> </=
span><span style=3D"color:#703daa">std</span><span>::</span><span style=3D"=
color:#703daa">shared_ptr</span><span>&lt;U&gt;&amp; r); =C2=A0 =C2=A0 =C2=
=A0 </span><span style=3D"color:#008400">// since C++11</span></p><p style=
=3D"font-size:11px;line-height:normal;font-family:Menlo"><span style=3D"col=
or:#bb2ca2">template</span><span>&lt;</span><span style=3D"color:#bb2ca2">c=
lass</span><span> T, </span><span style=3D"color:#bb2ca2">class</span><span=
> U&gt; </span><span style=3D"color:#703daa">std</span><span>::</span><span=
 style=3D"color:#703daa">shared_ptr</span><span>&lt;T&gt; reinterpret_point=
er_cast(</span><span style=3D"color:#bb2ca2">const</span><span> </span><spa=
n style=3D"color:#703daa">std</span><span>::</span><span style=3D"color:#70=
3daa">shared_ptr</span><span>&lt;U&gt;&amp; r); </span><span style=3D"color=
:#008400">// since C++17</span></p><p style=3D"font-size:11px;line-height:n=
ormal;font-family:Menlo;min-height:13px"><span></span><br></p><p style=3D"f=
ont-size:11px;line-height:normal;font-family:Menlo"><span style=3D"color:#b=
b2ca2">template</span><span>&lt;</span><span style=3D"color:#bb2ca2">class<=
/span><span> T, </span><span style=3D"color:#bb2ca2">class</span><span> U&g=
t; </span><span style=3D"color:#703daa">std</span><span>::</span><span styl=
e=3D"color:#703daa">shared_ptr</span><span>&lt;T&gt; static_pointer_cast(</=
span><span style=3D"color:#703daa">std</span><span>::</span><span style=3D"=
color:#703daa">share<wbr>d_ptr</span><span>&lt;U&gt;&amp;&amp; r); =C2=A0 =
=C2=A0 =C2=A0</span><span style=3D"color:#008400">// proposed addition</spa=
n></p><p style=3D"font-size:11px;line-height:normal;font-family:Menlo"><spa=
n style=3D"color:#bb2ca2">template</span><span>&lt;</span><span style=3D"co=
lor:#bb2ca2">class</span><span> T, </span><span style=3D"color:#bb2ca2">cla=
ss</span><span> U&gt; </span><span style=3D"color:#703daa">std</span><span>=
::</span><span style=3D"color:#703daa">shared_ptr</span><span>&lt;T&gt; dyn=
amic_pointer_cast(</span><span style=3D"color:#703daa">std</span><span>::</=
span><span style=3D"color:#703daa">shar<wbr>ed_ptr</span><span>&lt;U&gt;&am=
p;&amp; r);=C2=A0 =C2=A0 =C2=A0</span><span style=3D"color:#008400">// prop=
osed addition</span></p><p style=3D"font-size:11px;line-height:normal;font-=
family:Menlo"><span style=3D"color:#bb2ca2">template</span><span>&lt;</span=
><span style=3D"color:#bb2ca2">class</span><span> T, </span><span style=3D"=
color:#bb2ca2">class</span><span> U&gt; </span><span style=3D"color:#703daa=
">std</span><span>::</span><span style=3D"color:#703daa">shared_ptr</span><=
span>&lt;T&gt; const_pointer_cast(</span><span style=3D"color:#703daa">std<=
/span><span>::</span><span style=3D"color:#703daa">shared<wbr>_ptr</span><s=
pan>&lt;U&gt;&amp;&amp; r);=C2=A0 =C2=A0 =C2=A0 =C2=A0</span><span style=3D=
"color:#008400">// proposed addition</span></p><p style=3D"font-size:11px;l=
ine-height:normal;font-family:Menlo;color:rgb(187,44,162)">







</p><p style=3D"font-size:11px;line-height:normal;font-family:Menlo"><span =
style=3D"color:#bb2ca2">template</span><span>&lt;</span><span style=3D"colo=
r:#bb2ca2">class</span><span> T, </span><span style=3D"color:#bb2ca2">class=
</span><span> U&gt; </span><span style=3D"color:#703daa">std</span><span>::=
</span><span style=3D"color:#703daa">shared_ptr</span><span>&lt;T&gt; reint=
erpret_pointer_cast(</span><span style=3D"color:#703daa">std</span><span>::=
</span><span style=3D"color:#703daa"><wbr>shared_ptr</span><span>&lt;U&gt;&=
amp;&amp; r);=C2=A0</span><span style=3D"color:#008400">// proposed additio=
n</span></p><p style=3D"font-size:11px;line-height:normal;font-family:Menlo=
"><span style=3D"color:#008400"><br></span></p><p style=3D"font-size:11px;l=
ine-height:normal;font-family:Menlo"><span style=3D"color:#008400"><span st=
yle=3D"color:rgb(34,34,34);font-family:Arial,Helvetica,sans-serif;font-size=
:13px">Or just have a single version of each function, that takes argument =
by value:</span><br></span></p><p style=3D"font-size:11px;line-height:norma=
l;font-family:Menlo"><span style=3D"color:#008400"><span style=3D"color:rgb=
(34,34,34);font-family:Arial,Helvetica,sans-serif;font-size:13px"><br></spa=
n></span></p><p style=3D"font-size:11px;line-height:normal;font-family:Menl=
o"><span style=3D"color:rgb(187,44,162)">template</span><span>&lt;</span><s=
pan style=3D"color:rgb(187,44,162)">class</span><span>=C2=A0T,=C2=A0</span>=
<span style=3D"color:rgb(187,44,162)">class</span><span>=C2=A0U&gt;=C2=A0</=
span><span style=3D"color:rgb(112,61,170)">std</span><span><wbr>::</span><s=
pan style=3D"color:rgb(112,61,170)">shared_ptr</span><span>&lt;T&gt; static=
_pointer_cast(</span><span style=3D"color:rgb(112,61,170)">std</span><span>=
::</span><span style=3D"color:rgb(112,61,170)">share<wbr>d_ptr</span><span>=
&lt;U&gt; r);=C2=A0=C2=A0 =C2=A0 =C2=A0</span><span style=3D"color:rgb(0,13=
2,0)">// proposed replacement</span></p><p style=3D"font-size:11px;line-hei=
ght:normal;font-family:Menlo"><span style=3D"color:rgb(187,44,162)">templat=
e</span><span>&lt;</span><span style=3D"color:rgb(187,44,162)">class</span>=
<span>=C2=A0T,=C2=A0</span><span style=3D"color:rgb(187,44,162)">class</spa=
n><span>=C2=A0U&gt;=C2=A0</span><span style=3D"color:rgb(112,61,170)">std</=
span><span><wbr>::</span><span style=3D"color:rgb(112,61,170)">shared_ptr</=
span><span>&lt;T&gt; dynamic_pointer_cast(</span><span style=3D"color:rgb(1=
12,61,170)">std</span><span>::</span><span style=3D"color:rgb(112,61,170)">=
shar<wbr>ed_ptr</span><span>&lt;U&gt; r);=C2=A0 =C2=A0 =C2=A0</span><span s=
tyle=3D"color:rgb(0,132,0)">// proposed=C2=A0</span><span style=3D"color:rg=
b(0,132,0)">replacement</span></p><p style=3D"font-size:11px;line-height:no=
rmal;font-family:Menlo"><span style=3D"color:rgb(187,44,162)">template</spa=
n><span>&lt;</span><span style=3D"color:rgb(187,44,162)">class</span><span>=
=C2=A0T,=C2=A0</span><span style=3D"color:rgb(187,44,162)">class</span><spa=
n>=C2=A0U&gt;=C2=A0</span><span style=3D"color:rgb(112,61,170)">std</span><=
span><wbr>::</span><span style=3D"color:rgb(112,61,170)">shared_ptr</span><=
span>&lt;T&gt; const_pointer_cast(</span><span style=3D"color:rgb(112,61,17=
0)">std</span><span>::</span><span style=3D"color:rgb(112,61,170)">shared<w=
br>_ptr</span><span>&lt;U&gt; r);=C2=A0 =C2=A0 =C2=A0 =C2=A0</span><span st=
yle=3D"color:rgb(0,132,0)">// proposed=C2=A0</span><span style=3D"color:rgb=
(0,132,0)">replacement</span></p><p style=3D"font-size:11px;line-height:nor=
mal;font-family:Menlo;color:rgb(187,44,162)"></p><p style=3D"font-size:11px=
;line-height:normal;font-family:Menlo"><span style=3D"color:#008400"></span=
></p><p style=3D"font-size:11px;line-height:normal;font-family:Menlo"><span=
 style=3D"color:rgb(187,44,162)">template</span><span>&lt;</span><span styl=
e=3D"color:rgb(187,44,162)">class</span><span>=C2=A0T,=C2=A0</span><span st=
yle=3D"color:rgb(187,44,162)">class</span><span>=C2=A0U&gt;=C2=A0</span><sp=
an style=3D"color:rgb(112,61,170)">std</span><span><wbr>::</span><span styl=
e=3D"color:rgb(112,61,170)">shared_ptr</span><span>&lt;T&gt; reinterpret_po=
inter_cast(</span><span style=3D"color:rgb(112,61,170)">std</span><span>::<=
/span><span style=3D"color:rgb(112,61,170)"><wbr>shared_ptr</span><span>&lt=
;U&gt; r);=C2=A0</span><span style=3D"color:rgb(0,132,0)">// proposed=C2=A0=
</span><span style=3D"color:rgb(0,132,0)">replacement</span></p><p style=3D=
"font-size:11px;line-height:normal;font-family:Menlo"><span style=3D"color:=
rgb(0,132,0)"><br></span></p><p style=3D"line-height:normal">The later make=
s a=C2=A0redundant=C2=A0increment/<wbr>decrement in one case: when doing=C2=
=A0<span style=3D"font-family:Menlo;font-size:11px">dynamic_pointer_cast=C2=
=A0</span>on a l-value and cast fails<span style=3D"font-family:Menlo;font-=
size:11px;color:rgb(0,132,0)"><br></span></p><p style=3D"line-height:normal=
"><br></p><p style=3D"line-height:normal"><br></p></div></div></blockquote>=
</div></div></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/633216ff-c3df-4d6f-b33f-3457c87c7996%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/633216ff-c3df-4d6f-b33f-3457c87c7996=
%40isocpp.org</a>.<br />

------=_Part_268_874370203.1467370249387--

------=_Part_267_1398178785.1467370249386--

.
