Topic: Now that the std::forward alternative has been rejected


Author: mihailnajdenov@gmail.com
Date: Sun, 24 Dec 2017 00:47:29 -0800 (PST)
Raw View
------=_Part_12554_1402040117.1514105249893
Content-Type: multipart/alternative;
 boundary="----=_Part_12555_870348575.1514105249894"

------=_Part_12555_870348575.1514105249894
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

Hello, I read=20
<https://botondballo.wordpress.com/2017/11/20/trip-report-c-standards-meeti=
ng-in-albuquerque-november-2017/>=20
the proposal "Forward without forward" has been rejected.

Now, can we please reconsider fixing forward "the right way" even if it=20
involves hacks?

And by "the right way" a mean, of course, let the template param be omitted=
..

Why is the right way? Multiple reasons:


   1. Preserve the API taught for close to 10 years now.
   2. Remove confusion for EVERYONE learning C++11+, be at a beginner or=20
   advanced user.
   3. The param is confusing on its own (to a beginner) - should I pass T=
=20
   or T&&, what happens if I pass const T, const T&&, T*? Do I really have=
=20
   options here?!? Or Just One Right Param?!?!
   4. The param is an ugly nightmare to pass in [](auto) {} scenario
   5. *Preserve* *and improve* symmetry with std::move!!! Both an operator=
=20
   and keyword break this, which is not good - std::move and std::forward a=
re=20
   closely related and should use similar API
   6. std::move is *way* more commonly used then frw for everyone except=20
   library writers - why should frw be that special to have its own op/keyw=
ord=20
   and move does not?!?
   7. There is no good operator and no good keyword to use
   8. Noone is really asking for a replacement (except library writers) but=
=20
   EVRYONE (except experts, I guess) ask for the bloody param to get lost.
   9. The param, technically CAN be deduced, thought not as regular=20
   argument passing.
  =20

It might be na=C3=AFve, but why, oh why, can't we define forward as

template< class T =3D /*implementation defined*/>

constexpr T&& forward( ... ) noexcept;

I mean, seriously?=20

The moment the compiler opens it mouth to say "can't deduce template=20
parameter '_Tp'" it just replaces it with decltype(arg). Old code still=20
works.=20
I am 1000% sure there is "a technical reason" why this "is not possible",=
=20
but... well if this case needs special rules, so be it - forward deserves=
=20
it.

And I mean it - no one is expecting forward and move to be "normal=20
functions", people are even surprised, move is so simple and (much like=20
forward) can be hacked with a simple cast!
If a special rule can be applied - forward deserves it - it is better,=20
simpler and backwards compatible then any keyword and operator.


Thank You
MihailNaydenov

--=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/ebc148fa-9b1f-4972-8a53-6f52c6ead259%40isocpp.or=
g.

------=_Part_12555_870348575.1514105249894
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><div>Hello, <a href=3D"https://botondballo.wordpress.com/2=
017/11/20/trip-report-c-standards-meeting-in-albuquerque-november-2017/">I =
read</a> the proposal &quot;Forward without forward&quot; has been rejected=
..</div><div><br></div><div>Now, can we please reconsider fixing forward &qu=
ot;the right way&quot; even if it involves hacks?</div><div><br></div><div>=
And by &quot;the right way&quot; a mean, of course, let the template param =
be omitted.</div><div><br></div><div>Why is the right way? Multiple reasons=
:</div><div><br></div><ol><li>Preserve the API taught for close to 10 years=
 now.</li><li>Remove confusion for EVERYONE learning C++11+, be at a beginn=
er or advanced user.</li><li>The param is confusing on its own (to a beginn=
er) - should I pass T or T&amp;&amp;, what happens if I pass const T, const=
 T&amp;&amp;, T*? Do I really have options here?!? Or Just One Right Param?=
!?!</li><li>The param is an ugly nightmare to pass in [](auto) {} scenario<=
/li><li><i>Preserve</i> <i>and improve</i> symmetry with std::move!!! Both =
an operator and keyword break this, which is not good - std::move and std::=
forward are closely related and should use similar API</li><li>std::move is=
 *way* more commonly used then frw for everyone except library writers - wh=
y should frw be that special to have its own op/keyword and move does not?!=
?</li><li><div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, =
34); border-image: none; text-align: left; color: rgb(34, 34, 34); text-tra=
nsform: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; fo=
nt-variant: normal; word-spacing: 0px; white-space: normal; orphans: 2; -we=
bkit-text-stroke-width: 0px; background-color: transparent;"><span style=3D=
"display: inline !important; float: none; background-color: transparent; co=
lor: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,=
sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font=
-weight: 400; letter-spacing: normal; line-height: 17px; orphans: 2; text-a=
lign: left; text-decoration: none; text-indent: 0px; text-transform: none; =
-webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">Th=
ere is no good operator and no good keyword to use</span></div></li><li><di=
v style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-i=
mage: none; text-align: left; color: rgb(34, 34, 34); text-transform: none;=
 text-indent: 0px; letter-spacing: normal; font-size: 13px; font-variant: n=
ormal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-str=
oke-width: 0px; background-color: transparent;"><span style=3D"display: inl=
ine !important; float: none; background-color: transparent; color: rgb(34, =
34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; f=
ont-size: 13px; font-style: normal; font-variant: normal; font-weight: 400;=
 letter-spacing: normal; line-height: 17px; orphans: 2; text-align: left; t=
ext-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-=
stroke-width: 0px; white-space: normal; word-spacing: 0px;">Noone is really=
 asking for a replacement (except library writers) but EVRYONE (except expe=
rts, I guess) ask for the bloody param to get lost.</span></div></li><li><d=
iv style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-=
image: none; text-align: left; color: rgb(34, 34, 34); text-transform: none=
; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-variant: =
normal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-st=
roke-width: 0px; background-color: transparent;"><span style=3D"display: in=
line !important; float: none; background-color: transparent; color: rgb(34,=
 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; =
font-size: 13px; font-style: normal; font-variant: normal; font-weight: 400=
; letter-spacing: normal; line-height: 17px; orphans: 2; text-align: left; =
text-decoration: none; text-indent: 0px; text-transform: none; -webkit-text=
-stroke-width: 0px; white-space: normal; word-spacing: 0px;">The param, tec=
hnically CAN be deduced, thought not as regular argument passing.</span></d=
iv></li></ol><div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 3=
4, 34); border-image: none; text-align: left; color: rgb(34, 34, 34); text-=
transform: none; text-indent: 0px; letter-spacing: normal; font-size: 13px;=
 font-variant: normal; word-spacing: 0px; white-space: normal; orphans: 2; =
-webkit-text-stroke-width: 0px; background-color: transparent;"><br></div><=
div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border=
-image: none; text-align: left; color: rgb(34, 34, 34); text-transform: non=
e; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-variant:=
 normal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-s=
troke-width: 0px; background-color: transparent;">It might be na=C3=AFve, b=
ut why, oh why, can&#39;t we define forward as</div><div style=3D"margin: 0=
px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: none; text-ali=
gn: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; l=
etter-spacing: normal; font-size: 13px; font-variant: normal; word-spacing:=
 0px; white-space: normal; orphans: 2; -webkit-text-stroke-width: 0px; back=
ground-color: transparent;"><br></div><div style=3D"margin: 0px; padding: 0=
px; border: 0px rgb(34, 34, 34); border-image: none; text-align: left; colo=
r: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing:=
 normal; font-size: 13px; font-variant: normal; word-spacing: 0px; white-sp=
ace: normal; orphans: 2; -webkit-text-stroke-width: 0px; background-color: =
transparent;"><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"prettyprint"><div class=3D"subprettyprint"><span class=3D"kw=
1" style=3D"background-color: transparent; color: rgb(0, 0, 221); font-fami=
ly: DejaVuSansMono,&amp;quot;DejaVu Sans Mono&amp;quot;,courier,monospace; =
font-size: 12.8px; font-style: normal; font-variant: normal; font-weight: 4=
00; letter-spacing: normal; line-height: 14.08px; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align:=
 left; text-decoration: none; text-indent: 0px; text-transform: none; -webk=
it-text-stroke-width: 0px; white-space: nowrap; word-spacing: 0px;"><span c=
lass=3D"styled-by-prettify" style=3D"color: #008;">template</span></span><s=
pan class=3D"sy1" style=3D"background-color: transparent; color: rgb(0, 0, =
128); font-family: DejaVuSansMono,&amp;quot;DejaVu Sans Mono&amp;quot;,cour=
ier,monospace; font-size: 12.8px; font-style: normal; font-variant: normal;=
 font-weight: 400; letter-spacing: normal; line-height: 14.08px; margin-bot=
tom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2;=
 padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0=
px; text-align: left; text-decoration: none; text-indent: 0px; text-transfo=
rm: none; -webkit-text-stroke-width: 0px; white-space: nowrap; word-spacing=
: 0px;"><span class=3D"styled-by-prettify" style=3D"color: #660;">&lt;</spa=
n></span><span style=3D"display: inline !important; float: none; background=
-color: transparent; color: rgb(0, 0, 0); font-family: DejaVuSansMono,&quot=
;DejaVu Sans Mono&quot;,courier,monospace; font-size: 12.8px; font-style: n=
ormal; font-variant: normal; font-weight: 400; letter-spacing: normal; line=
-height: 14.08px; orphans: 2; text-align: left; text-decoration: none; text=
-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-s=
pace: nowrap; word-spacing: 0px;"><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> </span></span><span class=3D"kw1" style=3D"background-co=
lor: transparent; color: rgb(0, 0, 221); font-family: DejaVuSansMono,&amp;q=
uot;DejaVu Sans Mono&amp;quot;,courier,monospace; font-size: 12.8px; font-s=
tyle: normal; font-variant: normal; font-weight: 400; letter-spacing: norma=
l; line-height: 14.08px; margin-bottom: 0px; margin-left: 0px; margin-right=
: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px;=
 padding-right: 0px; padding-top: 0px; text-align: left; text-decoration: n=
one; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px=
; white-space: nowrap; word-spacing: 0px;"><span class=3D"styled-by-prettif=
y" style=3D"color: #008;">class</span></span><span style=3D"display: inline=
 !important; float: none; background-color: transparent; color: rgb(0, 0, 0=
); font-family: DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,monospa=
ce; font-size: 12.8px; font-style: normal; font-variant: normal; font-weigh=
t: 400; letter-spacing: normal; line-height: 14.08px; orphans: 2; text-alig=
n: left; text-decoration: none; text-indent: 0px; text-transform: none; -we=
bkit-text-stroke-width: 0px; white-space: nowrap; word-spacing: 0px;"><span=
 class=3D"styled-by-prettify" style=3D"color: #000;"> T </span><span class=
=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-pr=
ettify" style=3D"color: #800;">/*implementation defined*/</span></span><spa=
n class=3D"sy1" style=3D"background-color: transparent; color: rgb(0, 0, 12=
8); font-family: DejaVuSansMono,&amp;quot;DejaVu Sans Mono&amp;quot;,courie=
r,monospace; font-size: 12.8px; font-style: normal; font-variant: normal; f=
ont-weight: 400; letter-spacing: normal; line-height: 14.08px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
; text-align: left; text-decoration: none; text-indent: 0px; text-transform=
: none; -webkit-text-stroke-width: 0px; white-space: nowrap; word-spacing: =
0px;"><span class=3D"styled-by-prettify" style=3D"color: #660;">&gt;</span>=
</span><span class=3D"styled-by-prettify" style=3D"color: #000;"><br></span=
><span style=3D"display: inline !important; float: none; background-color: =
transparent; color: rgb(0, 0, 0); font-family: DejaVuSansMono,&quot;DejaVu =
Sans Mono&quot;,courier,monospace; font-size: 12.8px; font-style: normal; f=
ont-variant: normal; font-weight: 400; letter-spacing: normal; line-height:=
 14.08px; orphans: 2; text-align: left; text-decoration: none; text-indent:=
 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: no=
wrap; word-spacing: 0px;"><span class=3D"styled-by-prettify" style=3D"color=
: #000;"><br></span></span><span class=3D"kw4" style=3D"background-color: t=
ransparent; color: rgb(0, 0, 255); font-family: DejaVuSansMono,&amp;quot;De=
jaVu Sans Mono&amp;quot;,courier,monospace; font-size: 12.8px; font-style: =
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; lin=
e-height: 14.08px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
 margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; t=
ext-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whit=
e-space: nowrap; word-spacing: 0px;"><span class=3D"styled-by-prettify" sty=
le=3D"color: #008;">constexpr</span></span><span style=3D"display: inline !=
important; float: none; background-color: transparent; color: rgb(0, 0, 0);=
 font-family: DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,monospace=
; font-size: 12.8px; font-style: normal; font-variant: normal; font-weight:=
 400; letter-spacing: normal; line-height: 14.08px; orphans: 2; text-align:=
 left; text-decoration: none; text-indent: 0px; text-transform: none; -webk=
it-text-stroke-width: 0px; white-space: nowrap; word-spacing: 0px;"><span c=
lass=3D"styled-by-prettify" style=3D"color: #000;"> T</span></span><span cl=
ass=3D"sy3" style=3D"background-color: transparent; color: rgb(0, 0, 64); f=
ont-family: DejaVuSansMono,&amp;quot;DejaVu Sans Mono&amp;quot;,courier,mon=
ospace; font-size: 12.8px; font-style: normal; font-variant: normal; font-w=
eight: 400; letter-spacing: normal; line-height: 14.08px; margin-bottom: 0p=
x; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; paddin=
g-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; tex=
t-align: left; text-decoration: none; text-indent: 0px; text-transform: non=
e; -webkit-text-stroke-width: 0px; white-space: nowrap; word-spacing: 0px;"=
><span class=3D"styled-by-prettify" style=3D"color: #660;">&amp;&amp;</span=
></span><span style=3D"display: inline !important; float: none; background-=
color: transparent; color: rgb(0, 0, 0); font-family: DejaVuSansMono,&quot;=
DejaVu Sans Mono&quot;,courier,monospace; font-size: 12.8px; font-style: no=
rmal; font-variant: normal; font-weight: 400; letter-spacing: normal; line-=
height: 14.08px; orphans: 2; text-align: left; text-decoration: none; text-=
indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-sp=
ace: nowrap; word-spacing: 0px;"><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> forward</span></span><span class=3D"br0" style=3D"backgr=
ound-color: transparent; color: rgb(0, 128, 0); font-family: DejaVuSansMono=
,&amp;quot;DejaVu Sans Mono&amp;quot;,courier,monospace; font-size: 12.8px;=
 font-style: normal; font-variant: normal; font-weight: 400; letter-spacing=
: normal; line-height: 14.08px; margin-bottom: 0px; margin-left: 0px; margi=
n-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decora=
tion: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wid=
th: 0px; white-space: nowrap; word-spacing: 0px;"><span class=3D"styled-by-=
prettify" style=3D"color: #660;">(</span></span><span style=3D"display: inl=
ine !important; float: none; background-color: transparent; color: rgb(0, 0=
, 0); font-family: DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,mono=
space; font-size: 12.8px; font-style: normal; font-variant: normal; font-we=
ight: 400; letter-spacing: normal; line-height: 14.08px; orphans: 2; text-a=
lign: left; text-decoration: none; text-indent: 0px; text-transform: none; =
-webkit-text-stroke-width: 0px; white-space: nowrap; word-spacing: 0px;"><s=
pan class=3D"styled-by-prettify" style=3D"color: #000;"> </span></span><spa=
n class=3D"kw1" style=3D"background-color: transparent; color: rgb(0, 0, 22=
1); font-family: DejaVuSansMono,&amp;quot;DejaVu Sans Mono&amp;quot;,courie=
r,monospace; font-size: 12.8px; font-style: normal; font-variant: normal; f=
ont-weight: 400; letter-spacing: normal; line-height: 14.08px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
; text-align: left; text-decoration: none; text-indent: 0px; text-transform=
: none; -webkit-text-stroke-width: 0px; white-space: nowrap; word-spacing: =
0px;"><span class=3D"styled-by-prettify" style=3D"color: #660;">...</span><=
span class=3D"styled-by-prettify" style=3D"color: #000;"> </span></span><sp=
an class=3D"br0" style=3D"background-color: transparent; color: rgb(0, 128,=
 0); font-family: DejaVuSansMono,&amp;quot;DejaVu Sans Mono&amp;quot;,couri=
er,monospace; font-size: 12.8px; font-style: normal; font-variant: normal; =
font-weight: 400; letter-spacing: normal; line-height: 14.08px; margin-bott=
om: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x; text-align: left; text-decoration: none; text-indent: 0px; text-transfor=
m: none; -webkit-text-stroke-width: 0px; white-space: nowrap; word-spacing:=
 0px;"><span class=3D"styled-by-prettify" style=3D"color: #660;">)</span></=
span><span style=3D"display: inline !important; float: none; background-col=
or: transparent; color: rgb(0, 0, 0); font-family: DejaVuSansMono,&quot;Dej=
aVu Sans Mono&quot;,courier,monospace; font-size: 12.8px; font-style: norma=
l; font-variant: normal; font-weight: 400; letter-spacing: normal; line-hei=
ght: 14.08px; orphans: 2; text-align: left; text-decoration: none; text-ind=
ent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space=
: nowrap; word-spacing: 0px;"><span class=3D"styled-by-prettify" style=3D"c=
olor: #000;"> </span></span><span class=3D"kw1" style=3D"background-color: =
transparent; color: rgb(0, 0, 221); font-family: DejaVuSansMono,&amp;quot;D=
ejaVu Sans Mono&amp;quot;,courier,monospace; font-size: 12.8px; font-style:=
 normal; font-variant: normal; font-weight: 400; letter-spacing: normal; li=
ne-height: 14.08px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px=
; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padd=
ing-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; =
text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whi=
te-space: nowrap; word-spacing: 0px;"><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;">noexcept</span></span><span class=3D"sy4" style=3D"bac=
kground-color: transparent; color: rgb(0, 128, 128); font-family: DejaVuSan=
sMono,&amp;quot;DejaVu Sans Mono&amp;quot;,courier,monospace; font-size: 12=
..8px; font-style: normal; font-variant: normal; font-weight: 400; letter-sp=
acing: normal; line-height: 14.08px; margin-bottom: 0px; margin-left: 0px; =
margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; paddin=
g-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-d=
ecoration: none; text-indent: 0px; text-transform: none; -webkit-text-strok=
e-width: 0px; white-space: nowrap; word-spacing: 0px;"><span class=3D"style=
d-by-prettify" style=3D"color: #660;">;</span></span></div></code></div><b>=
</b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></div><div sty=
le=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image:=
 none; text-align: left; color: rgb(34, 34, 34); text-transform: none; text=
-indent: 0px; letter-spacing: normal; font-size: 13px; font-variant: normal=
; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-w=
idth: 0px; background-color: transparent;">I mean, seriously?=C2=A0</div><d=
iv style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-=
image: none; text-align: left; color: rgb(34, 34, 34); text-transform: none=
; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-variant: =
normal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-st=
roke-width: 0px; background-color: transparent;"><br></div><div style=3D"ma=
rgin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: none; t=
ext-align: left; color: rgb(34, 34, 34); text-transform: none; text-indent:=
 0px; letter-spacing: normal; font-size: 13px; font-variant: normal; word-s=
pacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-width: 0p=
x; background-color: transparent;">The moment the compiler opens it mouth t=
o say &quot;can&#39;t deduce template parameter &#39;_Tp&#39;&quot; it just=
 replaces it with decltype(arg). Old code still works.=C2=A0</div><div styl=
e=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: =
none; text-align: left; color: rgb(34, 34, 34); text-transform: none; text-=
indent: 0px; letter-spacing: normal; font-size: 13px; font-variant: normal;=
 word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-wi=
dth: 0px; background-color: transparent;">I am 1000% sure there is &quot;a =
technical reason&quot; why this &quot;is not possible&quot;, but... well if=
 this case needs special rules, so be it - forward deserves it.</div><div s=
tyle=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-imag=
e: none; text-align: left; color: rgb(34, 34, 34); text-transform: none; te=
xt-indent: 0px; letter-spacing: normal; font-size: 13px; font-variant: norm=
al; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stroke=
-width: 0px; background-color: transparent;"><br></div><div style=3D"margin=
: 0px; padding: 0px; border: 0px rgb(34, 34, 34); border-image: none; text-=
align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px=
; letter-spacing: normal; font-size: 13px; font-variant: normal; word-spaci=
ng: 0px; white-space: normal; orphans: 2; -webkit-text-stroke-width: 0px; b=
ackground-color: transparent;">And I mean it - no one is expecting forward =
and move to be &quot;normal functions&quot;, people are even surprised, mov=
e is so simple and (much like forward) can be hacked with a simple cast!</d=
iv><div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); bo=
rder-image: none; text-align: left; color: rgb(34, 34, 34); text-transform:=
 none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-vari=
ant: normal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-te=
xt-stroke-width: 0px; background-color: transparent;">If a special rule can=
 be applied - forward deserves it - it is better, simpler and backwards com=
patible then any keyword and operator.</div><div style=3D"margin: 0px; padd=
ing: 0px; border: 0px rgb(34, 34, 34); border-image: none; text-align: left=
; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-sp=
acing: normal; font-size: 13px; font-variant: normal; word-spacing: 0px; wh=
ite-space: normal; orphans: 2; -webkit-text-stroke-width: 0px; background-c=
olor: transparent;"><br></div><div style=3D"margin: 0px; padding: 0px; bord=
er: 0px rgb(34, 34, 34); border-image: none; text-align: left; color: rgb(3=
4, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: normal;=
 font-size: 13px; font-variant: normal; word-spacing: 0px; white-space: nor=
mal; orphans: 2; -webkit-text-stroke-width: 0px; background-color: transpar=
ent;"><br></div><div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34=
, 34, 34); border-image: none; text-align: left; color: rgb(34, 34, 34); te=
xt-transform: none; text-indent: 0px; letter-spacing: normal; font-size: 13=
px; font-variant: normal; word-spacing: 0px; white-space: normal; orphans: =
2; -webkit-text-stroke-width: 0px; background-color: transparent;">Thank Yo=
u</div><div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34)=
; border-image: none; text-align: left; color: rgb(34, 34, 34); text-transf=
orm: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-=
variant: normal; word-spacing: 0px; white-space: normal; orphans: 2; -webki=
t-text-stroke-width: 0px; background-color: transparent;">MihailNaydenov</d=
iv></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/ebc148fa-9b1f-4972-8a53-6f52c6ead259%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/ebc148fa-9b1f-4972-8a53-6f52c6ead259=
%40isocpp.org</a>.<br />

------=_Part_12555_870348575.1514105249894--

------=_Part_12554_1402040117.1514105249893--

.


Author: bastienpenava@gmail.com
Date: Sun, 24 Dec 2017 17:17:30 -0800 (PST)
Raw View
------=_Part_14282_1694928488.1514164650151
Content-Type: multipart/alternative;
 boundary="----=_Part_14283_1056359764.1514164650151"

------=_Part_14283_1056359764.1514164650151
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable



On Sunday, December 24, 2017 at 9:47:30 AM UTC+1, mihailn...@gmail.com=20
wrote:
>
> Hello, I read=20
> <https://botondballo.wordpress.com/2017/11/20/trip-report-c-standards-mee=
ting-in-albuquerque-november-2017/>=20
> the proposal "Forward without forward" has been rejected.
>
> Now, can we please reconsider fixing forward "the right way" even if it=
=20
> involves hacks?
>
> And by "the right way" a mean, of course, let the template param be=20
> omitted.
>
> Why is the right way? Multiple reasons:
>
>
>    1. Preserve the API taught for close to 10 years now.
>
> actually this is false.std::forward without template param is valid and=
=20
your change would change its meaning.

>
>    1. Remove confusion for EVERYONE learning C++11+, be at a beginner or=
=20
>    advanced user.
>    2. The param is confusing on its own (to a beginner) - should I pass T=
=20
>    or T&&, what happens if I pass const T, const T&&, T*? Do I really hav=
e=20
>    options here?!? Or Just One Right Param?!?!
>
> std::forward is fairly easy to explain to a beginner.
But even if it wasn't the case, cases where std::forward is required are=20
not for beginners (library writing, etc...).

>
>    1. The param is an ugly nightmare to pass in [](auto) {} scenario
>
> C++20 has template parameter for lambda so this is no longer a valid issu=
e.

>
>    1. *Preserve* *and improve* symmetry with std::move!!! Both an=20
>    operator and keyword break this, which is not good - std::move and=20
>    std::forward are closely related and should use similar API
>    2. std::move is *way* more commonly used then frw for everyone except=
=20
>    library writers - why should frw be that special to have its own op/ke=
yword=20
>    and move does not?!?
>
> I'm sorry but no. There is no symmetry between the two.
std::move force an object into a temporary object through casting.
std::forward ensures that rvalue arguments' ownership is transferred to=20
another function.

>
>    1. There is no good operator and no good keyword to use
>    2. Noone is really asking for a replacement (except library writers)=
=20
>    but EVRYONE (except experts, I guess) ask for the bloody param to get =
lost.
>   =20
> Library writers are really the only people that uses it so belittling=20
their opinion is wrong.

>
>    1. The param, technically CAN be deduced, thought not as regular=20
>    argument passing.
>   =20
>
> It might be na=C3=AFve, but why, oh why, can't we define forward as
>
> template< class T =3D /*implementation defined*/>
>
> constexpr T&& forward( ... ) noexcept;
>
> There is no way to make this work and using C's var_args is the worst fix=
=20
imaginable.
Retrieving a value from a C va_list is not constexpr.
It requires a named argument.
They are really slow.

Even today std::forward is already way slower than a simple static_cast so=
=20
making it worse is out of the question.
If you want a forward without parameter simply write a macro.
The point of barry's proposal was to fix at the language level a language=
=20
issue instead of using a library solution to a language issue.
=20

> I mean, seriously?=20
>
> The moment the compiler opens it mouth to say "can't deduce template=20
> parameter '_Tp'" it just replaces it with decltype(arg). Old code still=
=20
> works.=20
> I am 1000% sure there is "a technical reason" why this "is not possible",=
=20
> but... well if this case needs special rules, so be it - forward deserves=
=20
> it.
>
> And I mean it - no one is expecting forward and move to be "normal=20
> functions", people are even surprised, move is so simple and (much like=
=20
> forward) can be hacked with a simple cast!
> If a special rule can be applied - forward deserves it - it is better,=20
> simpler and backwards compatible then any keyword and operator.
>
>
> Thank You
> MihailNaydenov
>
=20

--=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/e447b9dd-d8d1-4b73-b1f3-4a6a5ab295a5%40isocpp.or=
g.

------=_Part_14283_1056359764.1514164650151
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Sunday, December 24, 2017 at 9:47:30 AM UTC+1, =
mihailn...@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margi=
n: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><di=
v dir=3D"ltr"><div>Hello, <a href=3D"https://botondballo.wordpress.com/2017=
/11/20/trip-report-c-standards-meeting-in-albuquerque-november-2017/" targe=
t=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D&#39;https://www.g=
oogle.com/url?q\x3dhttps%3A%2F%2Fbotondballo.wordpress.com%2F2017%2F11%2F20=
%2Ftrip-report-c-standards-meeting-in-albuquerque-november-2017%2F\x26sa\x3=
dD\x26sntz\x3d1\x26usg\x3dAFQjCNF_vL5Ngr4VIpnzXg9U_LHKICBxaA&#39;;return tr=
ue;" onclick=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps%3A%2=
F%2Fbotondballo.wordpress.com%2F2017%2F11%2F20%2Ftrip-report-c-standards-me=
eting-in-albuquerque-november-2017%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQ=
jCNF_vL5Ngr4VIpnzXg9U_LHKICBxaA&#39;;return true;">I read</a> the proposal =
&quot;Forward without forward&quot; has been rejected.</div><div><br></div>=
<div>Now, can we please reconsider fixing forward &quot;the right way&quot;=
 even if it involves hacks?</div><div><br></div><div>And by &quot;the right=
 way&quot; a mean, of course, let the template param be omitted.</div><div>=
<br></div><div>Why is the right way? Multiple reasons:</div><div><br></div>=
<ol><li>Preserve the API taught for close to 10 years now.</li></ol></div><=
/blockquote><div>actually this is false.std::forward without template param=
 is valid and your change would change its meaning.</div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;"><div dir=3D"ltr"><ol><li>Remove confusion for E=
VERYONE learning C++11+, be at a beginner or advanced user.</li><li>The par=
am is confusing on its own (to a beginner) - should I pass T or T&amp;&amp;=
, what happens if I pass const T, const T&amp;&amp;, T*? Do I really have o=
ptions here?!? Or Just One Right Param?!?!</li></ol></div></blockquote><div=
>std::forward is fairly easy to explain to a beginner.</div><div>But even i=
f it wasn&#39;t the case, cases where std::forward is required are not for =
beginners (library writing, etc...).</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"><ol><li>The param is an ugly nightmare to pass=
 in [](auto) {} scenario</li></ol></div></blockquote><div>C++20 has templat=
e parameter for lambda so this is no longer a valid issue.</div><blockquote=
 class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1=
px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><ol><li><i>Preserve</i> =
<i>and improve</i> symmetry with std::move!!! Both an operator and keyword =
break this, which is not good - std::move and std::forward are closely rela=
ted and should use similar API</li><li>std::move is *way* more commonly use=
d then frw for everyone except library writers - why should frw be that spe=
cial to have its own op/keyword and move does not?!?</li></ol></div></block=
quote><div>I&#39;m sorry but no. There is no symmetry between the two.</div=
><div>std::move force an object into a temporary object through casting.</d=
iv><div>std::forward ensures that rvalue arguments&#39; ownership is transf=
erred to another function.</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"><ol><li><div style=3D"margin:0px;padding:0px;border:0px =
rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-transform:none;text-=
indent:0px;letter-spacing:normal;font-size:13px;font-variant:normal;word-sp=
acing:0px;white-space:normal;background-color:transparent"><span style=3D"d=
isplay:inline!important;float:none;background-color:transparent;color:rgb(3=
4,34,34);font-family:&quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif;fon=
t-size:13px;font-style:normal;font-variant:normal;font-weight:400;letter-sp=
acing:normal;line-height:17px;text-align:left;text-decoration:none;text-ind=
ent:0px;text-transform:none;white-space:normal;word-spacing:0px">There is n=
o good operator and no good keyword to use</span></div></li><li><div style=
=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;color:r=
gb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;font=
-size:13px;font-variant:normal;word-spacing:0px;white-space:normal;backgrou=
nd-color:transparent"><span style=3D"display:inline!important;float:none;ba=
ckground-color:transparent;color:rgb(34,34,34);font-family:&quot;Arial&quot=
;,&quot;Helvetica&quot;,sans-serif;font-size:13px;font-style:normal;font-va=
riant:normal;font-weight:400;letter-spacing:normal;line-height:17px;text-al=
ign:left;text-decoration:none;text-indent:0px;text-transform:none;white-spa=
ce:normal;word-spacing:0px">Noone is really asking for a replacement (excep=
t library writers) but EVRYONE (except experts, I guess) ask for the bloody=
 param to get lost.</span></div></li></ol></div></blockquote><div>Library w=
riters are really the only people that uses it so=C2=A0belittling their opi=
nion is wrong.</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr"><ol><li><div style=3D"margin:0px;padding:0px;border:0px rgb(34,34,=
34);text-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px=
;letter-spacing:normal;font-size:13px;font-variant:normal;word-spacing:0px;=
white-space:normal;background-color:transparent"><span style=3D"display:inl=
ine!important;float:none;background-color:transparent;color:rgb(34,34,34);f=
ont-family:&quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif;font-size:13p=
x;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:norm=
al;line-height:17px;text-align:left;text-decoration:none;text-indent:0px;te=
xt-transform:none;white-space:normal;word-spacing:0px">The param, technical=
ly CAN be deduced, thought not as regular argument passing.</span></div></l=
i></ol><div style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-a=
lign:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-sp=
acing:normal;font-size:13px;font-variant:normal;word-spacing:0px;white-spac=
e:normal;background-color:transparent"><br></div><div style=3D"margin:0px;p=
adding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);tex=
t-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-=
variant:normal;word-spacing:0px;white-space:normal;background-color:transpa=
rent">It might be na=C3=AFve, but why, oh why, can&#39;t we define forward =
as</div><div style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-=
align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-s=
pacing:normal;font-size:13px;font-variant:normal;word-spacing:0px;white-spa=
ce:normal;background-color:transparent"><br></div><div style=3D"margin:0px;=
padding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);te=
xt-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font=
-variant:normal;word-spacing:0px;white-space:normal;background-color:transp=
arent"><div style=3D"border:1px solid rgb(187,187,187);word-wrap:break-word=
;background-color:rgb(250,250,250)"><code><div><span><span style=3D"color:#=
008">template</span></span><span><span style=3D"color:#660">&lt;</span></sp=
an><span style=3D"display:inline!important;float:none;background-color:tran=
sparent;color:rgb(0,0,0);font-family:DejaVuSansMono,&quot;DejaVu Sans Mono&=
quot;,courier,monospace;font-size:12.8px;font-style:normal;font-variant:nor=
mal;font-weight:400;letter-spacing:normal;line-height:14.08px;text-align:le=
ft;text-decoration:none;text-indent:0px;text-transform:none;white-space:now=
rap;word-spacing:0px"><span style=3D"color:#000"> </span></span><span><span=
 style=3D"color:#008">class</span></span><span style=3D"display:inline!impo=
rtant;float:none;background-color:transparent;color:rgb(0,0,0);font-family:=
DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,monospace;font-size:12.=
8px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:no=
rmal;line-height:14.08px;text-align:left;text-decoration:none;text-indent:0=
px;text-transform:none;white-space:nowrap;word-spacing:0px"><span style=3D"=
color:#000"> T </span><span style=3D"color:#660">=3D</span><span style=3D"c=
olor:#000"> </span><span style=3D"color:#800">/*implementation defined*/</s=
pan></span><span><span style=3D"color:#660">&gt;</span></span><span style=
=3D"color:#000"><br></span><span style=3D"display:inline!important;float:no=
ne;background-color:transparent;color:rgb(0,0,0);font-family:DejaVuSansMono=
,&quot;DejaVu Sans Mono&quot;,courier,monospace;font-size:12.8px;font-style=
:normal;font-variant:normal;font-weight:400;letter-spacing:normal;line-heig=
ht:14.08px;text-align:left;text-decoration:none;text-indent:0px;text-transf=
orm:none;white-space:nowrap;word-spacing:0px"><span style=3D"color:#000"><b=
r></span></span><span><span style=3D"color:#008">constexpr</span></span><sp=
an style=3D"display:inline!important;float:none;background-color:transparen=
t;color:rgb(0,0,0);font-family:DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,=
courier,monospace;font-size:12.8px;font-style:normal;font-variant:normal;fo=
nt-weight:400;letter-spacing:normal;line-height:14.08px;text-align:left;tex=
t-decoration:none;text-indent:0px;text-transform:none;white-space:nowrap;wo=
rd-spacing:0px"><span style=3D"color:#000"> T</span></span><span><span styl=
e=3D"color:#660">&amp;&amp;</span></span><span style=3D"display:inline!impo=
rtant;float:none;background-color:transparent;color:rgb(0,0,0);font-family:=
DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,monospace;font-size:12.=
8px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:no=
rmal;line-height:14.08px;text-align:left;text-decoration:none;text-indent:0=
px;text-transform:none;white-space:nowrap;word-spacing:0px"><span style=3D"=
color:#000"> forward</span></span><span><span style=3D"color:#660">(</span>=
</span><span style=3D"display:inline!important;float:none;background-color:=
transparent;color:rgb(0,0,0);font-family:DejaVuSansMono,&quot;DejaVu Sans M=
ono&quot;,courier,monospace;font-size:12.8px;font-style:normal;font-variant=
:normal;font-weight:400;letter-spacing:normal;line-height:14.08px;text-alig=
n:left;text-decoration:none;text-indent:0px;text-transform:none;white-space=
:nowrap;word-spacing:0px"><span style=3D"color:#000"> </span></span><span><=
span style=3D"color:#660">...</span><span style=3D"color:#000"> </span></sp=
an><span><span style=3D"color:#660">)</span></span><span style=3D"display:i=
nline!important;float:none;background-color:transparent;color:rgb(0,0,0);fo=
nt-family:DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,monospace;fon=
t-size:12.8px;font-style:normal;font-variant:normal;font-weight:400;letter-=
spacing:normal;line-height:14.08px;text-align:left;text-decoration:none;tex=
t-indent:0px;text-transform:none;white-space:nowrap;word-spacing:0px"><span=
 style=3D"color:#000"> </span></span><span><span style=3D"color:#000">noexc=
ept</span></span><span><span style=3D"color:#660">;</span></span></div></co=
de></div><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><br></=
div></div></blockquote><div>There is no way to make this work and using C&#=
39;s var_args is the worst fix imaginable.</div><div>Retrieving a value fro=
m a C va_list is not constexpr.</div><div>It requires a named argument.</di=
v><div>They are really slow.</div><div><br></div><div>Even today std::forwa=
rd is already way slower than a simple static_cast so making it worse is ou=
t of the question.</div><div>If you want a forward without parameter simply=
 write a macro.</div><div>The point of barry&#39;s proposal was to fix at t=
he language level a language issue instead of using a library solution to a=
 language issue.</div><div>=C2=A0<br></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 style=3D"margin:0px;padding:0px;border:0=
px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-transform:none;te=
xt-indent:0px;letter-spacing:normal;font-size:13px;font-variant:normal;word=
-spacing:0px;white-space:normal;background-color:transparent"></div><div st=
yle=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;colo=
r:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;f=
ont-size:13px;font-variant:normal;word-spacing:0px;white-space:normal;backg=
round-color:transparent">I mean, seriously?=C2=A0</div><div style=3D"margin=
:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,3=
4);text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px=
;font-variant:normal;word-spacing:0px;white-space:normal;background-color:t=
ransparent"><br></div><div style=3D"margin:0px;padding:0px;border:0px rgb(3=
4,34,34);text-align:left;color:rgb(34,34,34);text-transform:none;text-inden=
t:0px;letter-spacing:normal;font-size:13px;font-variant:normal;word-spacing=
:0px;white-space:normal;background-color:transparent">The moment the compil=
er opens it mouth to say &quot;can&#39;t deduce template parameter &#39;_Tp=
&#39;&quot; it just replaces it with decltype(arg). Old code still works.=
=C2=A0</div><div style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);t=
ext-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;lett=
er-spacing:normal;font-size:13px;font-variant:normal;word-spacing:0px;white=
-space:normal;background-color:transparent">I am 1000% sure there is &quot;=
a technical reason&quot; why this &quot;is not possible&quot;, but... well =
if this case needs special rules, so be it - forward deserves it.</div><div=
 style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;c=
olor:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:norma=
l;font-size:13px;font-variant:normal;word-spacing:0px;white-space:normal;ba=
ckground-color:transparent"><br></div><div style=3D"margin:0px;padding:0px;=
border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-transform=
:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-variant:nor=
mal;word-spacing:0px;white-space:normal;background-color:transparent">And I=
 mean it - no one is expecting forward and move to be &quot;normal function=
s&quot;, people are even surprised, move is so simple and (much like forwar=
d) can be hacked with a simple cast!</div><div style=3D"margin:0px;padding:=
0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-trans=
form:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-variant=
:normal;word-spacing:0px;white-space:normal;background-color:transparent">I=
f a special rule can be applied - forward deserves it - it is better, simpl=
er and backwards compatible then any keyword and operator.</div><div style=
=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:left;color:r=
gb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:normal;font=
-size:13px;font-variant:normal;word-spacing:0px;white-space:normal;backgrou=
nd-color:transparent"><br></div><div style=3D"margin:0px;padding:0px;border=
:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-transform:none;=
text-indent:0px;letter-spacing:normal;font-size:13px;font-variant:normal;wo=
rd-spacing:0px;white-space:normal;background-color:transparent"><br></div><=
div style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);text-align:lef=
t;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-spacing:no=
rmal;font-size:13px;font-variant:normal;word-spacing:0px;white-space:normal=
;background-color:transparent">Thank You</div><div style=3D"margin:0px;padd=
ing:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-t=
ransform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-var=
iant:normal;word-spacing:0px;white-space:normal;background-color:transparen=
t">MihailNaydenov</div></div></blockquote><div>=C2=A0<br></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/e447b9dd-d8d1-4b73-b1f3-4a6a5ab295a5%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/e447b9dd-d8d1-4b73-b1f3-4a6a5ab295a5=
%40isocpp.org</a>.<br />

------=_Part_14283_1056359764.1514164650151--

------=_Part_14282_1694928488.1514164650151--

.


Author: bastienpenava@gmail.com
Date: Sun, 24 Dec 2017 17:33:30 -0800 (PST)
Raw View
------=_Part_14418_246925809.1514165610274
Content-Type: multipart/alternative;
 boundary="----=_Part_14419_1549273340.1514165610274"

------=_Part_14419_1549273340.1514165610274
Content-Type: text/plain; charset="UTF-8"



On Monday, December 25, 2017 at 2:17:30 AM UTC+1, bastie...@gmail.com wrote:
>
>
>
> On Sunday, December 24, 2017 at 9:47:30 AM UTC+1, mihailn...@gmail.com
> wrote:
>>
>> Hello, I read
>> <https://botondballo.wordpress.com/2017/11/20/trip-report-c-standards-meeting-in-albuquerque-november-2017/>
>> the proposal "Forward without forward" has been rejected.
>>
>> Now, can we please reconsider fixing forward "the right way" even if it
>> involves hacks?
>>
>> And by "the right way" a mean, of course, let the template param be
>> omitted.
>>
>> Why is the right way? Multiple reasons:
>>
>>
>>    1. Preserve the API taught for close to 10 years now.
>>
>> actually this is false.std::forward without template param is valid and
> your change would change its meaning.
>
Sorry about that point I was wrong there.

--
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/f423d79b-62d7-4d01-824a-e8dfb1253442%40isocpp.org.

------=_Part_14419_1549273340.1514165610274
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Monday, December 25, 2017 at 2:17:30 AM UTC+1, =
bastie...@gmail.com wrote:<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"><br><br>On Sunday, December 24, 2017 at 9:47:30 AM UTC+1, <a>m=
ihailn...@gmail.com</a> wrote:<blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div =
dir=3D"ltr"><div>Hello, <a href=3D"https://botondballo.wordpress.com/2017/1=
1/20/trip-report-c-standards-meeting-in-albuquerque-november-2017/" rel=3D"=
nofollow" target=3D"_blank" onmousedown=3D"this.href=3D&#39;https://www.goo=
gle.com/url?q\x3dhttps%3A%2F%2Fbotondballo.wordpress.com%2F2017%2F11%2F20%2=
Ftrip-report-c-standards-meeting-in-albuquerque-november-2017%2F\x26sa\x3dD=
\x26sntz\x3d1\x26usg\x3dAFQjCNF_vL5Ngr4VIpnzXg9U_LHKICBxaA&#39;;return true=
;" onclick=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps%3A%2F%=
2Fbotondballo.wordpress.com%2F2017%2F11%2F20%2Ftrip-report-c-standards-meet=
ing-in-albuquerque-november-2017%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjC=
NF_vL5Ngr4VIpnzXg9U_LHKICBxaA&#39;;return true;">I read</a> the proposal &q=
uot;Forward without forward&quot; has been rejected.</div><div><br></div><d=
iv>Now, can we please reconsider fixing forward &quot;the right way&quot; e=
ven if it involves hacks?</div><div><br></div><div>And by &quot;the right w=
ay&quot; a mean, of course, let the template param be omitted.</div><div><b=
r></div><div>Why is the right way? Multiple reasons:</div><div><br></div><o=
l><li>Preserve the API taught for close to 10 years now.</li></ol></div></b=
lockquote><div>actually this is false.std::forward without template param i=
s valid and your change would change its meaning.</div></div></blockquote><=
div>Sorry about that point I was wrong there.=C2=A0</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/f423d79b-62d7-4d01-824a-e8dfb1253442%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/f423d79b-62d7-4d01-824a-e8dfb1253442=
%40isocpp.org</a>.<br />

------=_Part_14419_1549273340.1514165610274--

------=_Part_14418_246925809.1514165610274--

.


Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 24 Dec 2017 20:28:05 -0800 (PST)
Raw View
------=_Part_14608_921327778.1514176085868
Content-Type: multipart/alternative;
 boundary="----=_Part_14609_111628405.1514176085868"

------=_Part_14609_111628405.1514176085868
Content-Type: text/plain; charset="UTF-8"

On Sunday, December 24, 2017 at 8:17:30 PM UTC-5, bastie...@gmail.com wrote:
>
> On Sunday, December 24, 2017 at 9:47:30 AM UTC+1, mihailn...@gmail.com
> wrote:
>>
>> Hello, I read
>> <https://botondballo.wordpress.com/2017/11/20/trip-report-c-standards-meeting-in-albuquerque-november-2017/>
>> the proposal "Forward without forward" has been rejected.
>>
>> Now, can we please reconsider fixing forward "the right way" even if it
>> involves hacks?
>>
>> And by "the right way" a mean, of course, let the template param be
>> omitted.
>>
>> Why is the right way? Multiple reasons:
>>
>>
>>    1. Preserve the API taught for close to 10 years now.
>>
>> actually this is false.std::forward without template param is valid and
> your change would change its meaning.
>
>>
>>    1. Remove confusion for EVERYONE learning C++11+, be at a beginner or
>>    advanced user.
>>    2. The param is confusing on its own (to a beginner) - should I pass
>>    T or T&&, what happens if I pass const T, const T&&, T*? Do I really have
>>    options here?!? Or Just One Right Param?!?!
>>
>> std::forward is fairly easy to explain to a beginner.
>

No, it's not. It's easy to tell a beginner what they have to do and when
they have to do it. But explaining what it actually is doing (beyond
simplistic "it's forwarding the parameters") is not easy.

But even if it wasn't the case, cases where std::forward is required are
> not for beginners (library writing, etc...).
>

Nonsense. Writing passthrough functions should be in* everyone's* toolkit,
not just "library writers". Thinking like that is what makes people think
that template metaprogramming is OK, because regular C++ programmers
shouldn't want to do things like iterate over things at compile time or
somesuch.

Making the powers of the language more accessible is not a bad thing.


>>    1. The param is an ugly nightmare to pass in [](auto) {} scenario
>>
>> C++20 has template parameter for lambda so this is no longer a valid
> issue.
>

Which only trades one verbosity for another.

[](auto&&... args) {return some_func(std::forward<decltype(args)>(args
)...);}

vs.

[]<template ...Args>(Args &&...args) {return some_func(std::forward<Args>(
args)...);}

This is not an improvement.

And code like this is certainly not limited to "library writers". Not
unless C++ gets lifting lambdas/overload set lambdas (and that's sadly
unlikely at this point). And even if we had that feature, we'd still need
this.

--
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/1a84e87b-c045-408c-9828-b1aba2185a0a%40isocpp.org.

------=_Part_14609_111628405.1514176085868
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">On Sunday, December 24, 2017 at 8:17:30 PM UTC-5, bastie..=
..@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;marg=
in-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"=
ltr">On Sunday, December 24, 2017 at 9:47:30 AM UTC+1, <a>mihailn...@gmail.=
com</a> wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-le=
ft:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div=
>Hello, <a onmousedown=3D"this.href=3D&#39;https://www.google.com/url?q\x3d=
https%3A%2F%2Fbotondballo.wordpress.com%2F2017%2F11%2F20%2Ftrip-report-c-st=
andards-meeting-in-albuquerque-november-2017%2F\x26sa\x3dD\x26sntz\x3d1\x26=
usg\x3dAFQjCNF_vL5Ngr4VIpnzXg9U_LHKICBxaA&#39;;return true;" onclick=3D"thi=
s.href=3D&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fbotondballo.wor=
dpress.com%2F2017%2F11%2F20%2Ftrip-report-c-standards-meeting-in-albuquerqu=
e-november-2017%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF_vL5Ngr4VIpnzXg=
9U_LHKICBxaA&#39;;return true;" href=3D"https://botondballo.wordpress.com/2=
017/11/20/trip-report-c-standards-meeting-in-albuquerque-november-2017/" ta=
rget=3D"_blank" rel=3D"nofollow">I read</a> the proposal &quot;Forward with=
out forward&quot; has been rejected.</div><div><br></div><div>Now, can we p=
lease reconsider fixing forward &quot;the right way&quot; even if it involv=
es hacks?</div><div><br></div><div>And by &quot;the right way&quot; a mean,=
 of course, let the template param be omitted.</div><div><br></div><div>Why=
 is the right way? Multiple reasons:</div><div><br></div><ol><li>Preserve t=
he API taught for close to 10 years now.</li></ol></div></blockquote><div>a=
ctually this is false.std::forward without template param is valid and your=
 change would change its meaning.</div><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1=
ex"><div dir=3D"ltr"><ol><li>Remove confusion for EVERYONE learning C++11+,=
 be at a beginner or advanced user.</li><li>The param is confusing on its o=
wn (to a beginner) - should I pass T or T&amp;&amp;, what happens if I pass=
 const T, const T&amp;&amp;, T*? Do I really have options here?!? Or Just O=
ne Right Param?!?!</li></ol></div></blockquote><div>std::forward is fairly =
easy to explain to a beginner.</div></div></blockquote><div><br></div><div>=
No, it&#39;s not. It&#39;s easy to tell a beginner what they have to do and=
 when they have to do it. But explaining what it actually is doing (beyond =
simplistic &quot;it&#39;s forwarding the parameters&quot;) is not easy.</di=
v><div><br></div><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>But even if it wasn&#39;t the case, cases where std::forward is re=
quired are not for beginners (library writing, etc...).</div></div></blockq=
uote><div><br></div><div>Nonsense. Writing passthrough functions should be =
in<i> everyone&#39;s</i> toolkit, not just &quot;library writers&quot;. Thi=
nking like that is what makes people think that template metaprogramming is=
 OK, because regular C++ programmers shouldn&#39;t want to do things like i=
terate over things at compile time or somesuch.</div><div><br></div><div>Ma=
king the powers of the language more accessible is not a bad thing.</div><d=
iv><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-le=
ft: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">=
<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;borde=
r-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><ol><li>The param =
is an ugly nightmare to pass in [](auto) {} scenario</li></ol></div></block=
quote><div>C++20 has template parameter for lambda so this is no longer a v=
alid issue.</div></div></blockquote><div><br></div><div>Which only trades o=
ne verbosity for another.</div><div><br></div><div class=3D"prettyprint" st=
yle=3D"border: 1px solid rgb(187, 187, 187); word-wrap: break-word; backgro=
und-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div class=3D"s=
ubprettyprint"><span class=3D"styled-by-prettify" style=3D"color: #660;">[]=
(</span><span class=3D"styled-by-prettify" style=3D"color: #008;">auto</spa=
n><span class=3D"styled-by-prettify" style=3D"color: #660;">&amp;&amp;...</=
span><span class=3D"styled-by-prettify" style=3D"color: #000;"> args</span>=
<span class=3D"styled-by-prettify" style=3D"color: #660;">)</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"sty=
led-by-prettify" style=3D"color: #660;">{</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #008;">return</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #000;"> some_func</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;">std</span><span class=3D"styled-by-prettify" style=3D"col=
or: #660;">::</span><span class=3D"styled-by-prettify" style=3D"color: #000=
;">forward</span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
&lt;</span><span class=3D"styled-by-prettify" style=3D"color: #008;">declty=
pe</span><span class=3D"styled-by-prettify" style=3D"color: #660;">(</span>=
<span class=3D"styled-by-prettify" style=3D"color: #000;">args</span><span =
class=3D"styled-by-prettify" style=3D"color: #660;">)&gt;(</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;">args</span><span class=3D"s=
tyled-by-prettify" style=3D"color: #660;">)...);}</span></div></code></div>=
<div><br></div><div>vs.</div><div><br></div><div class=3D"prettyprint" styl=
e=3D"border: 1px solid rgb(187, 187, 187); word-wrap: break-word; backgroun=
d-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div class=3D"sub=
prettyprint"><span class=3D"styled-by-prettify" style=3D"color: #660;">[]&l=
t;</span><span class=3D"styled-by-prettify" style=3D"color: #008;">template=
</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </span><s=
pan class=3D"styled-by-prettify" style=3D"color: #660;">...</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #606;">Args</span><span class=3D"=
styled-by-prettify" style=3D"color: #660;">&gt;(</span><span class=3D"style=
d-by-prettify" style=3D"color: #606;">Args</span><span class=3D"styled-by-p=
rettify" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" =
style=3D"color: #660;">&amp;&amp;...</span><span class=3D"styled-by-prettif=
y" style=3D"color: #000;">args</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #660;">)</span><span class=3D"styled-by-prettify" style=3D"col=
or: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #660;=
">{</span><span class=3D"styled-by-prettify" style=3D"color: #008;">return<=
/span><span class=3D"styled-by-prettify" style=3D"color: #000;"> some_func<=
/span><span class=3D"styled-by-prettify" style=3D"color: #660;">(</span><sp=
an class=3D"styled-by-prettify" style=3D"color: #000;">std</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #660;">::</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;">forward</span><span class=3D"styled=
-by-prettify" style=3D"color: #660;">&lt;</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #606;">Args</span><span class=3D"styled-by-prettify=
" style=3D"color: #660;">&gt;(</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #000;">args</span><span class=3D"styled-by-prettify" style=3D"=
color: #660;">)...);}</span><span class=3D"styled-by-prettify" style=3D"col=
or: #000;"><br></span></div></code></div><div><br></div><div>This is not an=
 improvement.</div><div><br></div><div>And code like this is certainly not =
limited to &quot;library writers&quot;. Not unless C++ gets lifting lambdas=
/overload set lambdas (and that&#39;s sadly unlikely at this point). And ev=
en if we had that feature, we&#39;d still need this.=C2=A0<br></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/1a84e87b-c045-408c-9828-b1aba2185a0a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/1a84e87b-c045-408c-9828-b1aba2185a0a=
%40isocpp.org</a>.<br />

------=_Part_14609_111628405.1514176085868--

------=_Part_14608_921327778.1514176085868--

.


Author: bastienpenava@gmail.com
Date: Sun, 24 Dec 2017 22:17:11 -0800 (PST)
Raw View
------=_Part_14791_1304117373.1514182631317
Content-Type: multipart/alternative;
 boundary="----=_Part_14792_2065278301.1514182631318"

------=_Part_14792_2065278301.1514182631318
Content-Type: text/plain; charset="UTF-8"



On Monday, December 25, 2017 at 5:28:05 AM UTC+1, Nicol Bolas wrote:
>
> On Sunday, December 24, 2017 at 8:17:30 PM UTC-5, bastie...@gmail.com
> wrote:
>>
>> On Sunday, December 24, 2017 at 9:47:30 AM UTC+1, mihailn...@gmail.com
>> wrote:
>>>
>>> Hello, I read
>>> <https://botondballo.wordpress.com/2017/11/20/trip-report-c-standards-meeting-in-albuquerque-november-2017/>
>>> the proposal "Forward without forward" has been rejected.
>>>
>>> Now, can we please reconsider fixing forward "the right way" even if it
>>> involves hacks?
>>>
>>> And by "the right way" a mean, of course, let the template param be
>>> omitted.
>>>
>>> Why is the right way? Multiple reasons:
>>>
>>>
>>>    1. Preserve the API taught for close to 10 years now.
>>>
>>> actually this is false.std::forward without template param is valid and
>> your change would change its meaning.
>>
>>>
>>>    1. Remove confusion for EVERYONE learning C++11+, be at a beginner
>>>    or advanced user.
>>>    2. The param is confusing on its own (to a beginner) - should I pass
>>>    T or T&&, what happens if I pass const T, const T&&, T*? Do I really have
>>>    options here?!? Or Just One Right Param?!?!
>>>
>>> std::forward is fairly easy to explain to a beginner.
>>
>
> No, it's not. It's easy to tell a beginner what they have to do and when
> they have to do it. But explaining what it actually is doing (beyond
> simplistic "it's forwarding the parameters") is not easy.
>

>

> But even if it wasn't the case, cases where std::forward is required are
>> not for beginners (library writing, etc...).
>>
>
> Nonsense. Writing passthrough functions should be in* everyone's*
> toolkit, not just "library writers". Thinking like that is what makes
> people think that template metaprogramming is OK, because regular C++
> programmers shouldn't want to do things like iterate over things at compile
> time or somesuch.
>
good passthrough functions will never be easy to write in C++. The
committee is not interested. The lambda abbreviated proposal by the same
person (which also applied to functions) aimed to make it easier and got
shutdown hard.

>
> Making the powers of the language more accessible is not a bad thing.
>
What makes you think I disagree with that ?
If anything I am an advocate of the original proposal of Barry Revzin.
I disagree though that It should be fixed by creating an implementation
defined library solution that violates the behaviour of a function and its
arguments.
We don't need more weird exceptions.

>
>
>>>    1. The param is an ugly nightmare to pass in [](auto) {} scenario
>>>
>>> C++20 has template parameter for lambda so this is no longer a valid
>> issue.
>>
>
> Which only trades one verbosity for another.
>
Being ugly and being verbose are two different things.

>
> [](auto&&... args) {return some_func(std::forward<decltype(args)>(args
> )...);}
>
> vs.
>
> []<template ...Args>(Args &&...args) {return some_func(std::forward<Args>(
> args)...);}
>
> This is not an improvement.
>

> And code like this is certainly not limited to "library writers". Not
> unless C++ gets lifting lambdas/overload set lambdas (and that's sadly
> unlikely at this point). And even if we had that feature, we'd still need
> this.
>

--
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/4a8c1326-d560-4d57-b8ab-afc85d627166%40isocpp.org.

------=_Part_14792_2065278301.1514182631318
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Monday, December 25, 2017 at 5:28:05 AM UTC+1, =
Nicol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;marg=
in-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"=
ltr">On Sunday, December 24, 2017 at 8:17:30 PM UTC-5, <a>bastie...@gmail.c=
om</a> wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-lef=
t:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Su=
nday, December 24, 2017 at 9:47:30 AM UTC+1, <a>mihailn...@gmail.com</a> wr=
ote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;b=
order-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Hello, <a=
 href=3D"https://botondballo.wordpress.com/2017/11/20/trip-report-c-standar=
ds-meeting-in-albuquerque-november-2017/" rel=3D"nofollow" target=3D"_blank=
" onmousedown=3D"this.href=3D&#39;https://www.google.com/url?q\x3dhttps%3A%=
2F%2Fbotondballo.wordpress.com%2F2017%2F11%2F20%2Ftrip-report-c-standards-m=
eeting-in-albuquerque-november-2017%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAF=
QjCNF_vL5Ngr4VIpnzXg9U_LHKICBxaA&#39;;return true;" onclick=3D"this.href=3D=
&#39;https://www.google.com/url?q\x3dhttps%3A%2F%2Fbotondballo.wordpress.co=
m%2F2017%2F11%2F20%2Ftrip-report-c-standards-meeting-in-albuquerque-novembe=
r-2017%2F\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNF_vL5Ngr4VIpnzXg9U_LHKICB=
xaA&#39;;return true;">I read</a> the proposal &quot;Forward without forwar=
d&quot; has been rejected.</div><div><br></div><div>Now, can we please reco=
nsider fixing forward &quot;the right way&quot; even if it involves hacks?<=
/div><div><br></div><div>And by &quot;the right way&quot; a mean, of course=
, let the template param be omitted.</div><div><br></div><div>Why is the ri=
ght way? Multiple reasons:</div><div><br></div><ol><li>Preserve the API tau=
ght for close to 10 years now.</li></ol></div></blockquote><div>actually th=
is is false.std::forward without template param is valid and your change wo=
uld change its meaning.</div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div d=
ir=3D"ltr"><ol><li>Remove confusion for EVERYONE learning C++11+, be at a b=
eginner or advanced user.</li><li>The param is confusing on its own (to a b=
eginner) - should I pass T or T&amp;&amp;, what happens if I pass const T, =
const T&amp;&amp;, T*? Do I really have options here?!? Or Just One Right P=
aram?!?!</li></ol></div></blockquote><div>std::forward is fairly easy to ex=
plain to a beginner.</div></div></blockquote><div><br></div><div>No, it&#39=
;s not. It&#39;s easy to tell a beginner what they have to do and when they=
 have to do it. But explaining what it actually is doing (beyond simplistic=
 &quot;it&#39;s forwarding the parameters&quot;) is not easy.=C2=A0</div></=
div></blockquote><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>=C2=A0</div></div></blockquote><blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-le=
ft: 1ex;"><div dir=3D"ltr"><div><br></div><blockquote class=3D"gmail_quote"=
 style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-lef=
t:1ex"><div dir=3D"ltr"><div>But even if it wasn&#39;t the case, cases wher=
e std::forward is required are not for beginners (library writing, etc...).=
</div></div></blockquote><div><br></div><div>Nonsense. Writing passthrough =
functions should be in<i> everyone&#39;s</i> toolkit, not just &quot;librar=
y writers&quot;. Thinking like that is what makes people think that templat=
e metaprogramming is OK, because regular C++ programmers shouldn&#39;t want=
 to do things like iterate over things at compile time or somesuch.</div></=
div></blockquote><div>good passthrough functions will never be easy to writ=
e in C++. The committee is not interested. The lambda abbreviated proposal =
by the same person (which also applied to functions) aimed to make it easie=
r and got shutdown hard.</div><blockquote class=3D"gmail_quote" style=3D"ma=
rgin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">=
<div dir=3D"ltr"><div><br></div><div>Making the powers of the language more=
 accessible is not a bad thing.</div></div></blockquote><div>What makes you=
 think I disagree with that ?</div><div>If anything I am an advocate of the=
 original proposal of Barry Revzin.</div><div>I disagree though that It sho=
uld be fixed by creating an implementation defined library solution that vi=
olates the behaviour of a function and its arguments.</div><div>We don&#39;=
t need more weird exceptions.</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><br></div><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1e=
x"><div dir=3D"ltr"><blockquote class=3D"gmail_quote" style=3D"margin:0;mar=
gin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr=
"><ol><li>The param is an ugly nightmare to pass in [](auto) {} scenario</l=
i></ol></div></blockquote><div>C++20 has template parameter for lambda so t=
his is no longer a valid issue.</div></div></blockquote><div><br></div><div=
>Which only trades one verbosity for another.=C2=A0</div></div></blockquote=
><div>Being ugly and being verbose are two different things.</div><blockquo=
te 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><br></div><div st=
yle=3D"border:1px solid rgb(187,187,187);word-wrap:break-word;background-co=
lor:rgb(250,250,250)"><code><div><span style=3D"color:#660">[](</span><span=
 style=3D"color:#008">auto</span><span style=3D"color:#660">&amp;&amp;...</=
span><span style=3D"color:#000"> args</span><span style=3D"color:#660">)</s=
pan><span style=3D"color:#000"> </span><span style=3D"color:#660">{</span><=
span style=3D"color:#008">return</span><span style=3D"color:#000"> some_fun=
c</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">forward=
</span><span style=3D"color:#660">&lt;</span><span style=3D"color:#008">dec=
ltyp<wbr>e</span><span style=3D"color:#660">(</span><span style=3D"color:#0=
00">args</span><span style=3D"color:#660">)&gt;(</span><span style=3D"color=
:#000">args</span><span style=3D"color:#660">)...);}</span></div></code></d=
iv><div><br></div><div>vs.</div><div><br></div><div style=3D"border:1px sol=
id rgb(187,187,187);word-wrap:break-word;background-color:rgb(250,250,250)"=
><code><div><span style=3D"color:#660">[]&lt;</span><span style=3D"color:#0=
08">template</span><span style=3D"color:#000"> </span><span style=3D"color:=
#660">...</span><span style=3D"color:#606">Args</span><span style=3D"color:=
#660">&gt;(</span><span style=3D"color:#606">Args</span><span style=3D"colo=
r:#000"> </span><span style=3D"color:#660">&amp;&amp;...</span><span style=
=3D"color:#000">args</span><span style=3D"color:#660">)</span><span style=
=3D"color:#000"> </span><span style=3D"color:#660">{</span><span style=3D"c=
olor:#008">return</span><span style=3D"color:#000"> some_func</span><span s=
tyle=3D"color:#660">(</span><span style=3D"color:#000">std</span><span styl=
e=3D"color:#660">::</span><span style=3D"color:#000">forward</span><span st=
yle=3D"color:#660">&lt;</span><span style=3D"color:#606">Args</span><span s=
tyle=3D"color:#660">&gt;(</span><span style=3D"color:#000">a<wbr>rgs</span>=
<span style=3D"color:#660">)...);}</span><span style=3D"color:#000"><br></s=
pan></div></code></div><div><br></div><div>This is not an improvement.=C2=
=A0</div></div></blockquote><blockquote class=3D"gmail_quote" style=3D"marg=
in: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><d=
iv dir=3D"ltr"><div><br></div><div>And code like this is certainly not limi=
ted to &quot;library writers&quot;. Not unless C++ gets lifting lambdas/ove=
rload set lambdas (and that&#39;s sadly unlikely at this point). And even i=
f we had that feature, we&#39;d still need this.=C2=A0<br></div></div></blo=
ckquote></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/4a8c1326-d560-4d57-b8ab-afc85d627166%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/4a8c1326-d560-4d57-b8ab-afc85d627166=
%40isocpp.org</a>.<br />

------=_Part_14792_2065278301.1514182631318--

------=_Part_14791_1304117373.1514182631317--

.


Author: Jim Porter <jvp4846@g.rit.edu>
Date: Mon, 25 Dec 2017 00:21:12 -0600
Raw View
On 12/24/2017 10:28 PM, Nicol Bolas wrote:
> And code like this is certainly not limited to "library writers". Not
> unless C++ gets lifting lambdas/overload set lambdas (and that's sadly
> unlikely at this point).

Does that mean "not likely to get *ever*" or "not likely to get in the
immediate future"? I haven't followed the overload set stuff very
closely (too busy with other things, unfortunately), but I was
cautiously excited for it when the papers for it first showed up.

- Jim

--
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/p1q591%24cqe%241%40blaine.gmane.org.

.


Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 24 Dec 2017 22:48:10 -0800 (PST)
Raw View
------=_Part_14960_708739461.1514184490591
Content-Type: multipart/alternative;
 boundary="----=_Part_14961_925865880.1514184490592"

------=_Part_14961_925865880.1514184490592
Content-Type: text/plain; charset="UTF-8"



On Monday, December 25, 2017 at 1:21:32 AM UTC-5, Jim Porter wrote:
>
> On 12/24/2017 10:28 PM, Nicol Bolas wrote:
> > And code like this is certainly not limited to "library writers". Not
> > unless C++ gets lifting lambdas/overload set lambdas (and that's sadly
> > unlikely at this point).
>
> Does that mean "not likely to get *ever*" or "not likely to get in the
> immediate future"? I haven't followed the overload set stuff very
> closely (too busy with other things, unfortunately), but I was
> cautiously excited for it when the papers for it first showed up.
>

Well, considering that there have been at least 3 proposals for it, and
they didn't get farther than concept stage, I'd guess it's more the former
than the latter. For whatever reason, the committee seems utterly terrified
of doing anything of significance with lambdas.

--
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/19c8a5bf-2061-4318-8954-f1e243f12414%40isocpp.org.

------=_Part_14961_925865880.1514184490592
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Monday, December 25, 2017 at 1:21:32 AM UTC-5, =
Jim Porter wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On 12/24/2017=
 10:28 PM, Nicol Bolas wrote:
<br>&gt; And code like this is certainly not limited to &quot;library write=
rs&quot;. Not=20
<br>&gt; unless C++ gets lifting lambdas/overload set lambdas (and that&#39=
;s sadly=20
<br>&gt; unlikely at this point).
<br>
<br>Does that mean &quot;not likely to get *ever*&quot; or &quot;not likely=
 to get in the=20
<br>immediate future&quot;? I haven&#39;t followed the overload set stuff v=
ery=20
<br>closely (too busy with other things, unfortunately), but I was=20
<br>cautiously excited for it when the papers for it first showed up.<br></=
blockquote><div><br></div><div>Well, considering that there have been at le=
ast 3 proposals for it, and they didn&#39;t get farther than concept stage,=
 I&#39;d guess it&#39;s more the former than the latter. For whatever reaso=
n, the committee seems utterly terrified of doing anything of significance =
with lambdas.<br></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/19c8a5bf-2061-4318-8954-f1e243f12414%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/19c8a5bf-2061-4318-8954-f1e243f12414=
%40isocpp.org</a>.<br />

------=_Part_14961_925865880.1514184490592--

------=_Part_14960_708739461.1514184490591--

.


Author: mihailnajdenov@gmail.com
Date: Mon, 25 Dec 2017 01:27:09 -0800 (PST)
Raw View
------=_Part_14916_862137623.1514194029897
Content-Type: multipart/alternative;
 boundary="----=_Part_14917_1137661987.1514194029898"

------=_Part_14917_1137661987.1514194029898
Content-Type: text/plain; charset="UTF-8"


>
>
>>
>> template< class T = /*implementation defined*/>
>>
>> constexpr T&& forward( ... ) noexcept;
>>
>> There is no way to make this work and using C's var_args is the worst fix
> imaginable.
> Retrieving a value from a C va_list is not constexpr.
> It requires a named argument.
> They are really slow.
>
>
O, boy, by all means I was not suggesting  var_args, I was lazy to type.

Here is the complete specification (modified from cppreference).

template< class T = /* IMPLEMENTATION DEFINED */>

constexpr T&& forward( typename std::remove_reference<T>::type& t ) noexcept;


template< class T =  /* IMPLEMENTATION DEFINED */>

constexpr T&& forward( typename std::remove_reference<T>::type&& t ) noexcept;



DONE. Old code still works, if the compiler can't deduce the argument it
will be instructed to replace it with the result of decltype(t).


std::forward and std::move have symmetry as they are both *transfers* - one
is transferring ownership, the other is transferring "whatever you give me"
(constnes, ownership, whatever, I am hands off, move along).

Their naming is also good, the fact that they are syntactically NOT casts
is good design decision - might be implemented as cast, but semantically
they are not. Good job there.

The problem is only the necessary param of forward - everyone will and does
question why at some point.
And the answer is not an answer but an excuse - no new understanding is
received, it does not make you a better programmer it only shows
limitations of the implementation, nothing more.
Not unlike the pesky typename in template code (which is going away
luckily, 20 years later)


As for library writer only need forward. I don't see how is this the case.
The moment you need to wrap any template code you need it.

template< class Container, class UnaryPredicate >

auto find_if(Container& c, UnaryPredicate&& val)

{

  using std::begin;
  using std::end;

  return std::find_if(begin(c), end(c), std::forward<UnaryPredicate>(val));


}


You might argue, this is "library code", but It is the normal user who
might and will write it.

As for "library solution" vs "language". Yes I agree move and forward are
by nature language features,
but is too late to implement them as such, and an operator is hardly
"language level", just syntax sugar.

And if anyone is promoted to language, it is the wildly more popular move.
And by promoted I mean compiler support in the lines present by Microsoft
on the cppCon last year or may be it was the year before.
Right now you can move/forward twice the same variable without even an
warning, which is just a joke (aka Footgun).


P.S Marry Christmas, everyone!

--
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/cafca4af-400f-47f8-abab-48eef0727a99%40isocpp.org.

------=_Part_14917_1137661987.1514194029898
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bor=
der-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><blockquote c=
lass=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #c=
cc solid;padding-left:1ex"><div dir=3D"ltr"><div style=3D"margin:0px;paddin=
g:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34);text-tra=
nsform:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-varia=
nt:normal;word-spacing:0px;white-space:normal;background-color:transparent"=
><br></div><div style=3D"margin:0px;padding:0px;border:0px rgb(34,34,34);te=
xt-align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;lette=
r-spacing:normal;font-size:13px;font-variant:normal;word-spacing:0px;white-=
space:normal;background-color:transparent"><br></div><div style=3D"margin:0=
px;padding:0px;border:0px rgb(34,34,34);text-align:left;color:rgb(34,34,34)=
;text-transform:none;text-indent:0px;letter-spacing:normal;font-size:13px;f=
ont-variant:normal;word-spacing:0px;white-space:normal;background-color:tra=
nsparent"><div style=3D"border:1px solid rgb(187,187,187);word-wrap:break-w=
ord;background-color:rgb(250,250,250)"><code><div><span><span style=3D"colo=
r:#008">template</span></span><span><span style=3D"color:#660">&lt;</span><=
/span><span style=3D"display:inline!important;float:none;background-color:t=
ransparent;color:rgb(0,0,0);font-family:DejaVuSansMono,&quot;DejaVu Sans Mo=
no&quot;,courier,monospace;font-size:12.8px;font-style:normal;font-variant:=
normal;font-weight:400;letter-spacing:normal;line-height:14.08px;text-align=
:left;text-decoration:none;text-indent:0px;text-transform:none;white-space:=
nowrap;word-spacing:0px"><span style=3D"color:#000"> </span></span><span><s=
pan style=3D"color:#008">class</span></span><span style=3D"display:inline!i=
mportant;float:none;background-color:transparent;color:rgb(0,0,0);font-fami=
ly:DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,monospace;font-size:=
12.8px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing=
:normal;line-height:14.08px;text-align:left;text-decoration:none;text-inden=
t:0px;text-transform:none;white-space:nowrap;word-spacing:0px"><span style=
=3D"color:#000"> T </span><span style=3D"color:#660">=3D</span><span style=
=3D"color:#000"> </span><span style=3D"color:#800">/*implementation defined=
*/</span></span><span><span style=3D"color:#660">&gt;</span></span><span st=
yle=3D"color:#000"><br></span><span style=3D"display:inline!important;float=
:none;background-color:transparent;color:rgb(0,0,0);font-family:DejaVuSansM=
ono,&quot;DejaVu Sans Mono&quot;,courier,monospace;font-size:12.8px;font-st=
yle:normal;font-variant:normal;font-weight:400;letter-spacing:normal;line-h=
eight:14.08px;text-align:left;text-decoration:none;text-indent:0px;text-tra=
nsform:none;white-space:nowrap;word-spacing:0px"><span style=3D"color:#000"=
><br></span></span><span><span style=3D"color:#008">constexpr</span></span>=
<span style=3D"display:inline!important;float:none;background-color:transpa=
rent;color:rgb(0,0,0);font-family:DejaVuSansMono,&quot;DejaVu Sans Mono&quo=
t;,courier,monospace;font-size:12.8px;font-style:normal;font-variant:normal=
;font-weight:400;letter-spacing:normal;line-height:14.08px;text-align:left;=
text-decoration:none;text-indent:0px;text-transform:none;white-space:nowrap=
;word-spacing:0px"><span style=3D"color:#000"> T</span></span><span><span s=
tyle=3D"color:#660">&amp;&amp;</span></span><span style=3D"display:inline!i=
mportant;float:none;background-color:transparent;color:rgb(0,0,0);font-fami=
ly:DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,monospace;font-size:=
12.8px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing=
:normal;line-height:14.08px;text-align:left;text-decoration:none;text-inden=
t:0px;text-transform:none;white-space:nowrap;word-spacing:0px"><span style=
=3D"color:#000"> forward</span></span><span><span style=3D"color:#660">(</s=
pan></span><span style=3D"display:inline!important;float:none;background-co=
lor:transparent;color:rgb(0,0,0);font-family:DejaVuSansMono,&quot;DejaVu Sa=
ns Mono&quot;,courier,monospace;font-size:12.8px;font-style:normal;font-var=
iant:normal;font-weight:400;letter-spacing:normal;line-height:14.08px;text-=
align:left;text-decoration:none;text-indent:0px;text-transform:none;white-s=
pace:nowrap;word-spacing:0px"><span style=3D"color:#000"> </span></span><sp=
an><span style=3D"color:#660">...</span><span style=3D"color:#000"> </span>=
</span><span><span style=3D"color:#660">)</span></span><span style=3D"displ=
ay:inline!important;float:none;background-color:transparent;color:rgb(0,0,0=
);font-family:DejaVuSansMono,&quot;DejaVu Sans Mono&quot;,courier,monospace=
;font-size:12.8px;font-style:normal;font-variant:normal;font-weight:400;let=
ter-spacing:normal;line-height:14.08px;text-align:left;text-decoration:none=
;text-indent:0px;text-transform:none;white-space:nowrap;word-spacing:0px"><=
span style=3D"color:#000"> </span></span><span><span style=3D"color:#000">n=
oexcept</span></span><span><span style=3D"color:#660">;</span></span></div>=
</code></div><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike><b=
r></div></div></blockquote><div>There is no way to make this work and using=
 C&#39;s var_args is the worst fix imaginable.</div><div>Retrieving a value=
 from a C va_list is not constexpr.</div><div>It requires a named argument.=
</div><div>They are really slow.</div><div><br></div></div></blockquote><di=
v><br></div><div>O, boy, by all means I was not suggesting=C2=A0=C2=A0<span=
 style=3D"display: inline !important; float: none; background-color: transp=
arent; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helveti=
ca&quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: nor=
mal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left=
; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-te=
xt-stroke-width: 0px; white-space: normal; word-spacing: 0px;">var_args, I =
was lazy to type.</span></div><div><span style=3D"display: inline !importan=
t; float: none; background-color: transparent; color: rgb(34, 34, 34); font=
-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13p=
x; font-style: normal; font-variant: normal; font-weight: 400; letter-spaci=
ng: normal; orphans: 2; text-align: left; text-decoration: none; text-inden=
t: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: =
normal; word-spacing: 0px;"><br></span></div><div><span style=3D"display: i=
nline !important; float: none; background-color: transparent; color: rgb(34=
, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif;=
 font-size: 13px; font-style: normal; font-variant: normal; font-weight: 40=
0; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: n=
one; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px=
; white-space: normal; word-spacing: 0px;">Here is the complete specificati=
on (modified from cppreference).</span></div><div><span style=3D"display: i=
nline !important; float: none; background-color: transparent; color: rgb(34=
, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif;=
 font-size: 13px; font-style: normal; font-variant: normal; font-weight: 40=
0; letter-spacing: normal; orphans: 2; text-align: left; text-decoration: n=
one; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px=
; white-space: normal; word-spacing: 0px;"><br></span></div><span style=3D"=
display: inline !important; float: none; background-color: transparent; col=
or: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,s=
ans-serif; font-size: 13px; font-style: normal; font-variant: normal; font-=
weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-dec=
oration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-=
width: 0px; white-space: normal; word-spacing: 0px;"><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"><span style=3D" color:#0000ff;"><span class=3D"styled=
-by-prettify" style=3D"color: #008;">template</span></span><span style=3D" =
color:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #660;">&=
lt;</span></span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-p=
rettify" style=3D"color: #000;"> </span></span><span style=3D" color:#0000f=
f;"><span class=3D"styled-by-prettify" style=3D"color: #008;">class</span><=
/span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;"> </span></span><span style=3D" color:#00aaff;"><span c=
lass=3D"styled-by-prettify" style=3D"color: #000;">T</span></span><span sty=
le=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #=
000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D=
</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </span><s=
pan class=3D"styled-by-prettify" style=3D"color: #800;">/* IMPLEMENTATION D=
EFINED */</span></span><span style=3D" color:#000000;"><span class=3D"style=
d-by-prettify" style=3D"color: #660;">&gt;</span></span><span class=3D"styl=
ed-by-prettify" style=3D"color: #000;"><br></span><pre style=3D" margin-top=
:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-inden=
t:0; text-indent:0px;"><span style=3D" color:#0000ff;"><span class=3D"style=
d-by-prettify" style=3D"color: #008;">constexpr</span></span><span style=3D=
" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #000;"=
> </span></span><span style=3D" color:#00aaff;"><span class=3D"styled-by-pr=
ettify" style=3D"color: #000;">T</span></span><span style=3D" color:#000000=
;"><span class=3D"styled-by-prettify" style=3D"color: #660;">&amp;&amp;</sp=
an></span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify=
" style=3D"color: #000;"> </span></span><span style=3D" color:#000000;"><sp=
an class=3D"styled-by-prettify" style=3D"color: #000;">forward</span></span=
><span style=3D" color:#000000;"><span class=3D"styled-by-prettify" style=
=3D"color: #660;">(</span></span><span style=3D" color:#c0c0c0;"><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;"> </span></span><span style=
=3D" color:#0000ff;"><span class=3D"styled-by-prettify" style=3D"color: #00=
8;">typename</span></span><span style=3D" color:#c0c0c0;"><span class=3D"st=
yled-by-prettify" style=3D"color: #000;"> </span></span><span style=3D" col=
or:#00aaff;"><span class=3D"styled-by-prettify" style=3D"color: #000;">std<=
/span></span><span style=3D" color:#000000;"><span class=3D"styled-by-prett=
ify" style=3D"color: #660;">::</span></span><span style=3D" color:#00aaff;"=
><span class=3D"styled-by-prettify" style=3D"color: #000;">remove_reference=
</span></span><span style=3D" color:#000000;"><span class=3D"styled-by-pret=
tify" style=3D"color: #660;">&lt;</span></span><span style=3D" color:#00aaf=
f;"><span class=3D"styled-by-prettify" style=3D"color: #000;">T</span></spa=
n><span style=3D" color:#000000;"><span class=3D"styled-by-prettify" style=
=3D"color: #660;">&gt;::</span></span><span style=3D" color:#00aaff;"><span=
 class=3D"styled-by-prettify" style=3D"color: #000;">type</span></span><spa=
n style=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"col=
or: #660;">&amp;</span></span><span style=3D" color:#c0c0c0;"><span class=
=3D"styled-by-prettify" style=3D"color: #000;"> </span></span><span class=
=3D"styled-by-prettify" style=3D"color: #000;">t</span><span style=3D" colo=
r:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #000;"> </sp=
an></span><span style=3D" color:#000000;"><span class=3D"styled-by-prettify=
" style=3D"color: #660;">)</span></span><span style=3D" color:#c0c0c0;"><sp=
an class=3D"styled-by-prettify" style=3D"color: #000;"> </span></span><span=
 style=3D" color:#0000ff;"><span class=3D"styled-by-prettify" style=3D"colo=
r: #000;">noexcept</span></span><span style=3D" color:#000000;"><span class=
=3D"styled-by-prettify" style=3D"color: #660;">;</span></span></pre><span c=
lass=3D"styled-by-prettify" style=3D"color: #000;"><br></span><pre style=3D=
" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt=
-block-indent:0; text-indent:0px;"><span style=3D" color:#0000ff;"><span cl=
ass=3D"styled-by-prettify" style=3D"color: #008;">template</span></span><sp=
an style=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"co=
lor: #660;">&lt;</span></span><span style=3D" color:#c0c0c0;"><span class=
=3D"styled-by-prettify" style=3D"color: #000;"> </span></span><span style=
=3D" color:#0000ff;"><span class=3D"styled-by-prettify" style=3D"color: #00=
8;">class</span></span><span style=3D" color:#c0c0c0;"><span class=3D"style=
d-by-prettify" style=3D"color: #000;"> </span></span><span style=3D" color:=
#00aaff;"><span class=3D"styled-by-prettify" style=3D"color: #000;">T</span=
></span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" =
style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"=
color: #660;">=3D</span><span class=3D"styled-by-prettify" style=3D"color: =
#000;"> </span><span style=3D"background-color: transparent; border-bottom-=
color: rgb(192, 192, 192); border-bottom-style: none; border-bottom-width: =
0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sli=
ce: 100%; border-image-source: none; border-image-width: 1; border-left-col=
or: rgb(192, 192, 192); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(192, 192, 192); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(192, 192, 192); border-top-style: none;=
 border-top-width: 0px; color: rgb(192, 192, 192); font-family: &amp;quot;A=
rial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; f=
ont-style: normal; font-variant: normal; font-weight: 400; letter-spacing: =
normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top=
: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0=
px; padding-top: 0px; text-align: left; text-decoration: none; text-indent:=
 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: no=
rmal; word-spacing: 0px;"><span class=3D"styled-by-prettify" style=3D"color=
: #000;">=C2=A0</span><span class=3D"styled-by-prettify" style=3D"color: #8=
00;">/* IMPLEMENTATION DEFINED */</span></span><span style=3D"background-co=
lor: transparent; border-bottom-color: rgb(0, 0, 0); border-bottom-style: n=
one; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat:=
 stretch; border-image-slice: 100%; border-image-source: none; border-image=
-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: non=
e; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-styl=
e: none; border-top-width: 0px; color: rgb(0, 0, 0); font-family: &amp;quot=
;Arial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px;=
 font-style: normal; font-variant: normal; font-weight: 400; letter-spacing=
: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right:=
 0px; padding-top: 0px; text-align: left; text-decoration: none; text-inden=
t: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: =
normal; word-spacing: 0px;"></span></span><span style=3D" color:#000000;"><=
span class=3D"styled-by-prettify" style=3D"color: #660;">&gt;</span></span>=
<span class=3D"styled-by-prettify" style=3D"color: #000;"><br></span></pre>=
<pre style=3D" margin-top:0px; margin-bottom:0px; margin-left:0px; margin-r=
ight:0px; -qt-block-indent:0; text-indent:0px;"><span style=3D" color:#0000=
ff;"><span class=3D"styled-by-prettify" style=3D"color: #008;">constexpr</s=
pan></span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettif=
y" style=3D"color: #000;"> </span></span><span style=3D" color:#00aaff;"><s=
pan class=3D"styled-by-prettify" style=3D"color: #000;">T</span></span><spa=
n style=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"col=
or: #660;">&amp;&amp;</span></span><span style=3D" color:#c0c0c0;"><span cl=
ass=3D"styled-by-prettify" style=3D"color: #000;"> </span></span><span styl=
e=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #0=
00;">forward</span></span><span style=3D" color:#000000;"><span class=3D"st=
yled-by-prettify" style=3D"color: #660;">(</span></span><span style=3D" col=
or:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #000;"> </s=
pan></span><span style=3D" color:#0000ff;"><span class=3D"styled-by-prettif=
y" style=3D"color: #008;">typename</span></span><span style=3D" color:#c0c0=
c0;"><span class=3D"styled-by-prettify" style=3D"color: #000;"> </span></sp=
an><span style=3D" color:#00aaff;"><span class=3D"styled-by-prettify" style=
=3D"color: #000;">std</span></span><span style=3D" color:#000000;"><span cl=
ass=3D"styled-by-prettify" style=3D"color: #660;">::</span></span><span sty=
le=3D" color:#00aaff;"><span class=3D"styled-by-prettify" style=3D"color: #=
000;">remove_reference</span></span><span style=3D" color:#000000;"><span c=
lass=3D"styled-by-prettify" style=3D"color: #660;">&lt;</span></span><span =
style=3D" color:#00aaff;"><span class=3D"styled-by-prettify" style=3D"color=
: #000;">T</span></span><span style=3D" color:#000000;"><span class=3D"styl=
ed-by-prettify" style=3D"color: #660;">&gt;::</span></span><span style=3D" =
color:#00aaff;"><span class=3D"styled-by-prettify" style=3D"color: #000;">t=
ype</span></span><span style=3D" color:#000000;"><span class=3D"styled-by-p=
rettify" style=3D"color: #660;">&amp;&amp;</span></span><span style=3D" col=
or:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #000;"> </s=
pan></span><span class=3D"styled-by-prettify" style=3D"color: #000;">t</spa=
n><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> </span></span><span style=3D" color:#000000;"><span clas=
s=3D"styled-by-prettify" style=3D"color: #660;">)</span></span><span style=
=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #00=
0;"> </span></span><span style=3D" color:#0000ff;"><span class=3D"styled-by=
-prettify" style=3D"color: #000;">noexcept</span></span><span style=3D" col=
or:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #660;">;</s=
pan></span></pre></div></code></div><div><b></b><i></i><u></u><sub></sub><s=
up></sup><strike><br></strike></div><div><br></div><div>DONE. Old code stil=
l works, if the compiler can&#39;t deduce the argument it will be instructe=
d to replace it with the result of decltype(t).</div><div><br></div><div><b=
r></div><div>std::forward and std::move have symmetry as they are both <i>t=
ransfers</i> - one is transferring ownership, the other is transferring &qu=
ot;whatever you give me&quot; (constnes, ownership, whatever, I am hands of=
f, move along). </div><div><br></div><div>Their naming is also good, the fa=
ct that they are syntactically NOT casts is good design decision - might be=
 implemented as cast, but semantically they are not. Good job there.</div><=
div><br></div><div>The problem is only the necessary param of forward - eve=
ryone will and does question why at some point.</div><div> And the answer i=
s not an answer but an excuse - no new understanding is received, it does n=
ot make you a better programmer it only shows limitations of the implementa=
tion, nothing more.</div><div>Not unlike the pesky typename in template cod=
e (which is going away luckily, 20 years later) =C2=A0</div><div><br></div>=
<div><br></div><div>As for library writer only need forward. I don&#39;t se=
e how is this the case. The moment you need to wrap any template code you n=
eed it.</div><div><br></div><div><div class=3D"prettyprint" style=3D"border=
: 1px solid rgb(187, 187, 187); word-wrap: break-word; background-color: rg=
b(250, 250, 250);"><div class=3D"subprettyprint"><code class=3D"prettyprint=
"><span style=3D" color:#0000ff;"><span class=3D"styled-by-prettify" style=
=3D"color: #008;">template</span></span><span style=3D" color:#000000;"><sp=
an class=3D"styled-by-prettify" style=3D"color: #660;">&lt;</span></span><s=
pan style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"c=
olor: #000;"> </span></span><span style=3D" color:#0000ff;"><span class=3D"=
styled-by-prettify" style=3D"color: #008;">class</span></span><span style=
=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #00=
0;"> </span></span><span style=3D" color:#00aaff;"><span class=3D"styled-by=
-prettify" style=3D"color: #606;">Container</span></span><span style=3D" co=
lor:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #660;">,</=
span></span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-pretti=
fy" style=3D"color: #000;"> </span></span><span style=3D" color:#0000ff;"><=
span class=3D"styled-by-prettify" style=3D"color: #008;">class</span></span=
><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> </span></span><span style=3D" color:#00aaff;"><span clas=
s=3D"styled-by-prettify" style=3D"color: #606;">UnaryPredicate</span></span=
><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> </span></span><span style=3D" color:#000000;"><span clas=
s=3D"styled-by-prettify" style=3D"color: #660;">&gt;</span></span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #000;"><br></span><pre style=3D" =
margin-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-b=
lock-indent:0; text-indent:0px;"><span style=3D" color:#0000ff;"><span clas=
s=3D"styled-by-prettify" style=3D"color: #008;">auto</span></span><span sty=
le=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #=
000;"> </span></span><span style=3D" color:#000000;"><span class=3D"styled-=
by-prettify" style=3D"color: #000;">find_if</span></span><span style=3D" co=
lor:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #660;">(</=
span></span><span style=3D" color:#00aaff;"><span class=3D"styled-by-pretti=
fy" style=3D"color: #606;">Container</span></span><span style=3D" color:#00=
0000;"><span class=3D"styled-by-prettify" style=3D"color: #660;">&amp;</spa=
n></span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify"=
 style=3D"color: #000;"> </span></span><span style=3D" color:#000000;"><spa=
n class=3D"styled-by-prettify" style=3D"color: #000;">c</span></span><span =
style=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"color=
: #660;">,</span></span><span style=3D" color:#c0c0c0;"><span class=3D"styl=
ed-by-prettify" style=3D"color: #000;"> </span></span><span style=3D" color=
:#00aaff;"><span class=3D"styled-by-prettify" style=3D"color: #606;">UnaryP=
redicate</span></span><span style=3D" color:#000000;"><span class=3D"styled=
-by-prettify" style=3D"color: #660;">&amp;&amp;</span></span><span style=3D=
" color:#c0c0c0;"><span class=3D"styled-by-prettify" style=3D"color: #000;"=
> </span></span><span style=3D" color:#000000;"><span class=3D"styled-by-pr=
ettify" style=3D"color: #000;">val</span><span class=3D"styled-by-prettify"=
 style=3D"color: #660;">)</span></span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #000;"><br></span></pre><pre style=3D" margin-top:0px; margi=
n-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-indent:0; text-i=
ndent:0px;"><span style=3D" color:#000000;"><span class=3D"styled-by-pretti=
fy" style=3D"color: #660;">{</span></span></pre><span class=3D"styled-by-pr=
ettify" style=3D"color: #000;">=C2=A0 </span><span class=3D"styled-by-prett=
ify" style=3D"color: #008;">using</span><span class=3D"styled-by-prettify" =
style=3D"color: #000;"> std</span><span class=3D"styled-by-prettify" style=
=3D"color: #660;">::</span><span class=3D"styled-by-prettify" style=3D"colo=
r: #008;">begin</span><span class=3D"styled-by-prettify" style=3D"color: #6=
60;">;</span><span class=3D"styled-by-prettify" style=3D"color: #000;"><br>=
=C2=A0 </span><span class=3D"styled-by-prettify" style=3D"color: #008;">usi=
ng</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> std</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #660;">::</span><span=
 class=3D"styled-by-prettify" style=3D"color: #008;">end</span><span class=
=3D"styled-by-prettify" style=3D"color: #660;">;</span><span class=3D"style=
d-by-prettify" style=3D"color: #000;"> <br></span><pre style=3D" margin-top=
:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block-inden=
t:0; text-indent:0px;"><span style=3D" color:#c0c0c0;"><span class=3D"style=
d-by-prettify" style=3D"color: #000;">=C2=A0 </span></span><span style=3D" =
color:#0000ff;"><span class=3D"styled-by-prettify" style=3D"color: #008;">r=
eturn</span></span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by=
-prettify" style=3D"color: #000;"> </span></span><span style=3D" color:#00a=
aff;"><span class=3D"styled-by-prettify" style=3D"color: #000;">std</span><=
/span><span style=3D" color:#000000;"><span class=3D"styled-by-prettify" st=
yle=3D"color: #660;">::</span></span><span style=3D" color:#000000;"><span =
class=3D"styled-by-prettify" style=3D"color: #000;">find_if</span></span><s=
pan style=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"c=
olor: #660;">(</span></span><span style=3D" color:#000000;"><span class=3D"=
styled-by-prettify" style=3D"color: #008;">begin</span></span><span style=
=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #66=
0;">(</span></span><span style=3D" color:#000000;"><span class=3D"styled-by=
-prettify" style=3D"color: #000;">c</span></span><span style=3D" color:#000=
000;"><span class=3D"styled-by-prettify" style=3D"color: #660;">),</span></=
span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" sty=
le=3D"color: #000;"> </span></span><span style=3D" color:#000000;"><span cl=
ass=3D"styled-by-prettify" style=3D"color: #008;">end</span></span><span st=
yle=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"color: =
#660;">(</span></span><span style=3D" color:#000000;"><span class=3D"styled=
-by-prettify" style=3D"color: #000;">c</span></span><span style=3D" color:#=
000000;"><span class=3D"styled-by-prettify" style=3D"color: #660;">),</span=
></span><span style=3D" color:#c0c0c0;"><span class=3D"styled-by-prettify" =
style=3D"color: #000;"> </span></span><span style=3D" color:#00aaff;"><span=
 class=3D"styled-by-prettify" style=3D"color: #000;">std</span></span><span=
 style=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"colo=
r: #660;">::</span></span><span style=3D" color:#000000;"><span class=3D"st=
yled-by-prettify" style=3D"color: #000;">forward</span></span><span style=
=3D" color:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #66=
0;">&lt;</span></span><span class=3D"styled-by-prettify" style=3D"color: #6=
06;">UnaryPredicate</span><span style=3D" color:#000000;"><span class=3D"st=
yled-by-prettify" style=3D"color: #660;">&gt;(</span></span><span style=3D"=
 color:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #000;">=
val</span></span><span style=3D" color:#000000;"><span class=3D"styled-by-p=
rettify" style=3D"color: #660;">));</span></span></pre><span class=3D"style=
d-by-prettify" style=3D"color: #000;"><br></span></code><pre style=3D" marg=
in-top:0px; margin-bottom:0px; margin-left:0px; margin-right:0px; -qt-block=
-indent:0; text-indent:0px;"><code class=3D"prettyprint"><span style=3D" co=
lor:#000000;"><span class=3D"styled-by-prettify" style=3D"color: #660;">}</=
span></span></code><br></pre></div></div></div></span><span style=3D"displa=
y: inline !important; float: none; background-color: transparent; color: rg=
b(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-se=
rif; font-size: 13px; font-style: normal; font-variant: normal; font-weight=
: 400; letter-spacing: normal; orphans: 2; text-align: left; text-decoratio=
n: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width:=
 0px; white-space: normal; word-spacing: 0px;"><div><br></div><div>You migh=
t argue, this is &quot;library code&quot;, but It is the normal user who mi=
ght and will write it.<br></div></span><div><span style=3D"display: inline =
!important; float: none; background-color: transparent; color: rgb(34, 34, =
34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-=
size: 13px; font-style: normal; font-variant: normal; font-weight: 400; let=
ter-spacing: normal; orphans: 2; text-align: left; text-decoration: none; t=
ext-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; whit=
e-space: normal; word-spacing: 0px;"><br></span></div><div><span style=3D"d=
isplay: inline !important; float: none; background-color: transparent; colo=
r: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sa=
ns-serif; font-size: 13px; font-style: normal; font-variant: normal; font-w=
eight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-deco=
ration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-w=
idth: 0px; white-space: normal; word-spacing: 0px;">As for &quot;library so=
lution&quot; vs &quot;language&quot;. Yes I agree move and forward are by n=
ature language features, </span></div><div><span style=3D"display: inline !=
important; float: none; background-color: transparent; color: rgb(34, 34, 3=
4); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-s=
ize: 13px; font-style: normal; font-variant: normal; font-weight: 400; lett=
er-spacing: normal; orphans: 2; text-align: left; text-decoration: none; te=
xt-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white=
-space: normal; word-spacing: 0px;">but is too late to implement them as su=
ch, and an operator is hardly &quot;language level&quot;, just syntax sugar=
..</span></div><div><span style=3D"display: inline !important; float: none; =
background-color: transparent; color: rgb(34, 34, 34); font-family: &quot;A=
rial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: n=
ormal; font-variant: normal; font-weight: 400; letter-spacing: normal; orph=
ans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-tra=
nsform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spa=
cing: 0px;"><br></span></div><div>And if anyone is promoted to language, it=
 is the wildly more popular move. </div><div>And by promoted I mean compile=
r support in the lines present by Microsoft on the cppCon last year or may =
be it was the year before.=C2=A0</div><div>Right now you can move/forward t=
wice the same variable without even an warning, which is just a joke (aka F=
ootgun).</div><div><br></div><span style=3D"display: inline !important; flo=
at: none; background-color: transparent; color: rgb(34, 34, 34); font-famil=
y: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; fon=
t-style: normal; font-variant: normal; font-weight: 400; letter-spacing: no=
rmal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px=
; text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal=
; word-spacing: 0px;"><div><br></div></span><div>P.S Marry Christmas, every=
one!</div><div><br></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/cafca4af-400f-47f8-abab-48eef0727a99%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/cafca4af-400f-47f8-abab-48eef0727a99=
%40isocpp.org</a>.<br />

------=_Part_14917_1137661987.1514194029898--

------=_Part_14916_862137623.1514194029897--

.