Topic: Structured Bindings - revisited
Author: Richard Hodges <hodges.r@gmail.com>
Date: Wed, 13 Dec 2017 02:15:56 -0800 (PST)
Raw View
------=_Part_14952_2122330984.1513160156311
Content-Type: multipart/alternative;
boundary="----=_Part_14953_1080683858.1513160156312"
------=_Part_14953_1080683858.1513160156312
Content-Type: text/plain; charset="UTF-8"
A simple example:
Here's a fairly common idiom, expressed in terms of a structured binding:
#include <iostream>
#include <vector>
#include <tuple>
int main()
{
std::vector<int> v = { 6,5,4,3,2,1 };
for( auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v),
end(v))
; first != last
; ++i, ++first)
{
std::cout << "index: " << i << "\t" << *first << "\n";
}
}
It seems sensible to me to group the loop's variables in a structured
binding since
- it's succinct and,
- they remain firmly local to the loop's scope
- It's the only way to declare multiple dissimilar variables within the
for statement.
However, this code is not DRY - the naming of the bound variables must
correspond to the creation of the tuple. Maintenance confusion awaits.
It seems to me that a small, non-breaking syntax change could allow this:
for( auto [i = size_t(0), first = begin(v), last = end(v)]
; first != last
; ++i, ++first)
{
// ...
}
which would:
a) *be 100% DRY*,
b) involve less typing
c) match the syntax for lambda capture (I could expand further on my
thoughts on that, but perhaps another day)
d) IMHO be easier to teach
Wouldn't that be better?
I'd value your thoughts.
--
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/cab89a33-c8e5-4ef0-8dbf-2f1c179fb8b1%40isocpp.org.
------=_Part_14953_1080683858.1513160156312
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">A simple example:<br><br>Here's a fairly common idiom,=
expressed in terms of a structured binding:<div><br></div><div><div><font =
face=3D"monospace, monospace">#include <iostream></font></div><div><f=
ont face=3D"monospace, monospace">#include <vector></font></div><div>=
<font face=3D"monospace, monospace">#include <tuple></font></div><div=
><font face=3D"monospace, monospace"><br></font></div><div><font face=3D"mo=
nospace, monospace">int main()</font></div><div><font face=3D"monospace, mo=
nospace">{</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=
=A0 std::vector<int> v =3D { 6,5,4,3,2,1 };</font></div><div><font fa=
ce=3D"monospace, monospace"><br></font></div><div><font face=3D"monospace, =
monospace">=C2=A0 =C2=A0 for( auto [i, first, last] =3D std::make_tuple(std=
::size_t(0)<wbr>, begin(v), end(v))</font></div><div><font face=3D"monospac=
e, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; first !=3D last</font></div><div=
><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++fi=
rst)</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 {</=
font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 std::cout << "index: " << i << "\t&=
quot; << *first << "\n";</font></div><div><font face=
=3D"monospace, monospace">=C2=A0 =C2=A0 }</font></div><div><font face=3D"mo=
nospace, monospace">}</font></div></div><div><br></div><div>It seems sensib=
le to me to group the loop's variables in a structured binding since=C2=
=A0</div><div><br></div><ul><li>it's succinct and,</li><li>they remain =
firmly local to the loop's scope</li><li>It's the only way to decla=
re multiple dissimilar variables within the for statement.<br></li></ul><di=
v><br></div><div>However, this code is not DRY - the naming of the bound va=
riables must correspond to the creation of the tuple. Maintenance confusion=
awaits.<br></div><div><br></div><div>It seems to me that a small, non-brea=
king syntax change could allow this:</div><div><br></div><div><div><font fa=
ce=3D"monospace, monospace">=C2=A0 =C2=A0 for( auto [i =3D size_t(0), first=
=3D begin(v), last =3D end(v)]</font></div><div><font face=3D"monospace, m=
onospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; first !=3D last</font></div><div><fo=
nt face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)=
</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 {</font=
></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0=
// ...</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =
}</font></div></div><div><font face=3D"monospace, monospace"><br></font></d=
iv><div>which would:</div><div><br></div><div>a) <b>be 100% DRY</b>,</div><=
div>b) involve less typing</div><div>c) match the syntax for lambda capture=
(I could expand further on my thoughts on that, but perhaps another day)<b=
r></div><div>d) IMHO be easier to teach</div><div><br></div><div>Wouldn'=
;t that be better?</div><div><br></div><div>I'd value your thoughts.</d=
iv><div><br></div><div><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/cab89a33-c8e5-4ef0-8dbf-2f1c179fb8b1%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/cab89a33-c8e5-4ef0-8dbf-2f1c179fb8b1=
%40isocpp.org</a>.<br />
------=_Part_14953_1080683858.1513160156312--
------=_Part_14952_2122330984.1513160156311--
.
Author: Giovanni Piero Deretta <gpderetta@gmail.com>
Date: Wed, 13 Dec 2017 02:20:59 -0800 (PST)
Raw View
------=_Part_15067_168472326.1513160459924
Content-Type: multipart/alternative;
boundary="----=_Part_15068_2066442553.1513160459924"
------=_Part_15068_2066442553.1513160459924
Content-Type: text/plain; charset="UTF-8"
On Wednesday, December 13, 2017 at 10:15:56 AM UTC, Richard Hodges wrote:
>
> A simple example:
>
> Here's a fairly common idiom, expressed in terms of a structured binding:
>
> #include <iostream>
> #include <vector>
> #include <tuple>
>
> int main()
> {
> std::vector<int> v = { 6,5,4,3,2,1 };
>
> for( auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v),
> end(v))
> ; first != last
> ; ++i, ++first)
> {
> std::cout << "index: " << i << "\t" << *first << "\n";
> }
> }
>
> It seems sensible to me to group the loop's variables in a structured
> binding since
>
>
> - it's succinct and,
> - they remain firmly local to the loop's scope
> - It's the only way to declare multiple dissimilar variables within
> the for statement.
>
>
> However, this code is not DRY - the naming of the bound variables must
> correspond to the creation of the tuple. Maintenance confusion awaits.
>
> It seems to me that a small, non-breaking syntax change could allow this:
>
> for( auto [i = size_t(0), first = begin(v), last = end(v)]
> ; first != last
> ; ++i, ++first)
> {
> // ...
> }
>
> which would:
>
> a) *be 100% DRY*,
> b) involve less typing
> c) match the syntax for lambda capture (I could expand further on my
> thoughts on that, but perhaps another day)
> d) IMHO be easier to teach
>
> Wouldn't that be better?
>
> I'd value your thoughts.
>
>
Or just allow auto to infer different values for each variable.
--
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/53a10b81-687a-40de-8420-b439d394af1a%40isocpp.org.
------=_Part_15068_2066442553.1513160459924
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Wednesday, December 13, 2017 at 10:15:56 AM UTC, Richar=
d Hodges 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=
">A simple example:<br><br>Here's a fairly common idiom, expressed in t=
erms of a structured binding:<div><br></div><div><div><font face=3D"monospa=
ce, monospace">#include <iostream></font></div><div><font face=3D"mon=
ospace, monospace">#include <vector></font></div><div><font face=3D"m=
onospace, monospace">#include <tuple></font></div><div><font face=3D"=
monospace, monospace"><br></font></div><div><font face=3D"monospace, monosp=
ace">int main()</font></div><div><font face=3D"monospace, monospace">{</fon=
t></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 std::vector&=
lt;int> v =3D { 6,5,4,3,2,1 };</font></div><div><font face=3D"monospace,=
monospace"><br></font></div><div><font face=3D"monospace, monospace">=C2=
=A0 =C2=A0 for( auto [i, first, last] =3D std::make_tuple(std::size_t(0)<wb=
r>, begin(v), end(v))</font></div><div><font face=3D"monospace, monospace">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0; first !=3D last</font></div><div><font face=3D=
"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></d=
iv><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 {</font></div><di=
v><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 std::cout=
<< "index: " << i << "\t" << *=
first << "\n";</font></div><div><font face=3D"monospace, mo=
nospace">=C2=A0 =C2=A0 }</font></div><div><font face=3D"monospace, monospac=
e">}</font></div></div><div><br></div><div>It seems sensible to me to group=
the loop's variables in a structured binding since=C2=A0</div><div><br=
></div><ul><li>it's succinct and,</li><li>they remain firmly local to t=
he loop's scope</li><li>It's the only way to declare multiple dissi=
milar variables within the for statement.<br></li></ul><div><br></div><div>=
However, this code is not DRY - the naming of the bound variables must corr=
espond to the creation of the tuple. Maintenance confusion awaits.<br></div=
><div><br></div><div>It seems to me that a small, non-breaking syntax chang=
e could allow this:</div><div><br></div><div><div><font face=3D"monospace, =
monospace">=C2=A0 =C2=A0 for( auto [i =3D size_t(0), first =3D begin(v), la=
st =3D end(v)]</font></div><div><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 =C2=A0 =C2=A0; first !=3D last</font></div><div><font face=3D"monosp=
ace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></div><div=
><font face=3D"monospace, monospace">=C2=A0 =C2=A0 {</font></div><div><font=
face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 // ...</font></d=
iv><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 }</font></div></d=
iv><div><font face=3D"monospace, monospace"><br></font></div><div>which wou=
ld:</div><div><br></div><div>a) <b>be 100% DRY</b>,</div><div>b) involve le=
ss typing</div><div>c) match the syntax for lambda capture (I could expand =
further on my thoughts on that, but perhaps another day)<br></div><div>d) I=
MHO be easier to teach</div><div><br></div><div>Wouldn't that be better=
?</div><div><br></div><div>I'd value your thoughts.</div><div><br></div=
></div></blockquote><div><br>Or just allow auto to infer different values f=
or each variable.<br>=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" 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/53a10b81-687a-40de-8420-b439d394af1a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/53a10b81-687a-40de-8420-b439d394af1a=
%40isocpp.org</a>.<br />
------=_Part_15068_2066442553.1513160459924--
------=_Part_15067_168472326.1513160459924--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Wed, 13 Dec 2017 12:49:17 +0000
Raw View
--001a113cd3b614413e05603832e7
Content-Type: text/plain; charset="UTF-8"
>
> Or just allow auto to infer different values for each variable.
>
That's a good point. Can anyone see a reason that auto *should not* allow a
list of variables to have different type?
On Wed, Dec 13, 2017 at 10:20 AM, Giovanni Piero Deretta <
gpderetta@gmail.com> wrote:
> On Wednesday, December 13, 2017 at 10:15:56 AM UTC, Richard Hodges wrote:
>>
>> A simple example:
>>
>> Here's a fairly common idiom, expressed in terms of a structured binding:
>>
>> #include <iostream>
>> #include <vector>
>> #include <tuple>
>>
>> int main()
>> {
>> std::vector<int> v = { 6,5,4,3,2,1 };
>>
>> for( auto [i, first, last] = std::make_tuple(std::size_t(0),
>> begin(v), end(v))
>> ; first != last
>> ; ++i, ++first)
>> {
>> std::cout << "index: " << i << "\t" << *first << "\n";
>> }
>> }
>>
>> It seems sensible to me to group the loop's variables in a structured
>> binding since
>>
>>
>> - it's succinct and,
>> - they remain firmly local to the loop's scope
>> - It's the only way to declare multiple dissimilar variables within
>> the for statement.
>>
>>
>> However, this code is not DRY - the naming of the bound variables must
>> correspond to the creation of the tuple. Maintenance confusion awaits.
>>
>> It seems to me that a small, non-breaking syntax change could allow this:
>>
>> for( auto [i = size_t(0), first = begin(v), last = end(v)]
>> ; first != last
>> ; ++i, ++first)
>> {
>> // ...
>> }
>>
>> which would:
>>
>> a) *be 100% DRY*,
>> b) involve less typing
>> c) match the syntax for lambda capture (I could expand further on my
>> thoughts on that, but perhaps another day)
>> d) IMHO be easier to teach
>>
>> Wouldn't that be better?
>>
>> I'd value your thoughts.
>>
>>
> Or just allow auto to infer different values for each variable.
>
>
> --
> 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/53a10b81-687a-40de-
> 8420-b439d394af1a%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/53a10b81-687a-40de-8420-b439d394af1a%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CAC%2B0CCOPXztFMfC_RrSz08YhuYvdOAqWH3sB%2BnkKr91W0ompiw%40mail.gmail.com.
--001a113cd3b614413e05603832e7
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div><blockquote class=3D"gmail_quote" style=3D"margin:0px=
0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><di=
v class=3D"gmail-adM">Or just allow auto to infer different values for each=
variable.</div></blockquote><br>That's a good point. Can anyone see a =
reason that auto <i>should not</i> allow a list of variables to have differ=
ent type?<br></div></div><div class=3D"gmail_extra"><br><div class=3D"gmail=
_quote">On Wed, Dec 13, 2017 at 10:20 AM, Giovanni Piero Deretta <span dir=
=3D"ltr"><<a href=3D"mailto:gpderetta@gmail.com" target=3D"_blank">gpder=
etta@gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div=
dir=3D"ltr"><div><div class=3D"h5">On Wednesday, December 13, 2017 at 10:1=
5:56 AM UTC, Richard Hodges 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">A simple example:<br><br>Here's a fairly common idiom=
, expressed in terms of a structured binding:<div><br></div><div><div><font=
face=3D"monospace, monospace">#include <iostream></font></div><div><=
font face=3D"monospace, monospace">#include <vector></font></div><div=
><font face=3D"monospace, monospace">#include <tuple></font></div><di=
v><font face=3D"monospace, monospace"><br></font></div><div><font face=3D"m=
onospace, monospace">int main()</font></div><div><font face=3D"monospace, m=
onospace">{</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=
=A0 std::vector<int> v =3D { 6,5,4,3,2,1 };</font></div><div><font fa=
ce=3D"monospace, monospace"><br></font></div><div><font face=3D"monospace, =
monospace">=C2=A0 =C2=A0 for( auto [i, first, last] =3D std::make_tuple(std=
::size_t(0)<wbr>, begin(v), end(v))</font></div><div><font face=3D"monospac=
e, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; first !=3D last</font></div><div=
><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++fi=
rst)</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 {</=
font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 std::cout << "index: " << i << "\t&=
quot; << *first << "\n";</font></div><div><font face=
=3D"monospace, monospace">=C2=A0 =C2=A0 }</font></div><div><font face=3D"mo=
nospace, monospace">}</font></div></div><div><br></div><div>It seems sensib=
le to me to group the loop's variables in a structured binding since=C2=
=A0</div><div><br></div><ul><li>it's succinct and,</li><li>they remain =
firmly local to the loop's scope</li><li>It's the only way to decla=
re multiple dissimilar variables within the for statement.<br></li></ul><di=
v><br></div><div>However, this code is not DRY - the naming of the bound va=
riables must correspond to the creation of the tuple. Maintenance confusion=
awaits.<br></div><div><br></div><div>It seems to me that a small, non-brea=
king syntax change could allow this:</div><div><br></div><div><div><font fa=
ce=3D"monospace, monospace">=C2=A0 =C2=A0 for( auto [i =3D size_t(0), first=
=3D begin(v), last =3D end(v)]</font></div><div><font face=3D"monospace, m=
onospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; first !=3D last</font></div><div><fo=
nt face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)=
</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 {</font=
></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0=
// ...</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =
}</font></div></div><div><font face=3D"monospace, monospace"><br></font></d=
iv><div>which would:</div><div><br></div><div>a) <b>be 100% DRY</b>,</div><=
div>b) involve less typing</div><div>c) match the syntax for lambda capture=
(I could expand further on my thoughts on that, but perhaps another day)<b=
r></div><div>d) IMHO be easier to teach</div><div><br></div><div>Wouldn'=
;t that be better?</div><div><br></div><div>I'd value your thoughts.</d=
iv><div><br></div></div></blockquote></div></div><div><br>Or just allow aut=
o to infer different values for each variable.<br>=C2=A0</div></div><span c=
lass=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/53a10b81-687a-40de-8420-b439d394af1a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/53a1=
0b81-687a-40de-<wbr>8420-b439d394af1a%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCOPXztFMfC_RrSz08YhuYvdOAqWH3=
sB%2BnkKr91W0ompiw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCOPXz=
tFMfC_RrSz08YhuYvdOAqWH3sB%2BnkKr91W0ompiw%40mail.gmail.com</a>.<br />
--001a113cd3b614413e05603832e7--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Wed, 13 Dec 2017 07:26:02 -0800 (PST)
Raw View
------=_Part_15952_43189376.1513178762420
Content-Type: multipart/alternative;
boundary="----=_Part_15953_850576071.1513178762459"
------=_Part_15953_850576071.1513178762459
Content-Type: text/plain; charset="UTF-8"
On Wednesday, December 13, 2017 at 5:15:56 AM UTC-5, Richard Hodges wrote:
>
> A simple example:
>
> Here's a fairly common idiom, expressed in terms of a structured binding:
>
I'm sure some people do this, but an indexed range view would handle this
much more easily and compactly:
for(auto &[i, val] : std::counted_view(rng))
{...}
#include <iostream>
> #include <vector>
> #include <tuple>
>
> int main()
> {
> std::vector<int> v = { 6,5,4,3,2,1 };
>
> for( auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v),
> end(v))
> ; first != last
> ; ++i, ++first)
> {
> std::cout << "index: " << i << "\t" << *first << "\n";
> }
> }
>
> It seems sensible to me to group the loop's variables in a structured
> binding since
>
>
> - it's succinct and,
> - they remain firmly local to the loop's scope
> - It's the only way to declare multiple dissimilar variables within
> the for statement.
>
>
> However, this code is not DRY - the naming of the bound variables must
> correspond to the creation of the tuple. Maintenance confusion awaits.
>
Perhaps you're mistaking DRY for some other principle. DRY is Don't Repeat
Yourself. This code involves no repetition of typenames, variable names,
objects, literals, or anything else. Nothing is being repeated; there is
simply distance between the "variable" and its initializer.
That has nothing to do with repetition.
It seems to me that a small, non-breaking syntax change could allow this:
>
Structured binding should not be used as a quick-and-dirty way to create
multiple variables of different types in a place where that wasn't possible
previously. And we *certainly* should not add syntax to encourage this.
Remember: they could have made `auto` do this exact thing when we
standardized it in 2011. But the committee expressly decided against it.
All of the reasons for not allowing it then are still just as valid now.
> for( auto [i = size_t(0), first = begin(v), last = end(v)]
> ; first != last
> ; ++i, ++first)
> {
> // ...
> }
>
> which would:
>
> a) *be 100% DRY*,
> b) involve less typing
>
59 characters vs. 79. That's not "much less", especially compared to the 45
characters in the range-based version.
> c) match the syntax for lambda capture (I could expand further on my
> thoughts on that, but perhaps another day)
> d) IMHO be easier to teach
>
This isn't something people should be doing anyway. So why would we want it
to be easy to teach?
--
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/be270d3b-d86d-4e6d-9e9c-483a9ea7eb98%40isocpp.org.
------=_Part_15953_850576071.1513178762459
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Wednesday, December 13, 2017 at 5:15:56 AM UTC-5, Richa=
rd Hodges 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"lt=
r">A simple example:<br><br>Here's a fairly common idiom, expressed in =
terms of a structured binding:</div></blockquote><div><br></div><div>I'=
m sure some people do this, but an indexed range view would handle this muc=
h more easily and compactly:</div><div><br></div><div style=3D"background-c=
olor: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: s=
olid; border-width: 1px; overflow-wrap: break-word;" class=3D"prettyprint">=
<code class=3D"prettyprint"><div class=3D"subprettyprint"><span style=3D"co=
lor: #008;" class=3D"styled-by-prettify">for</span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">(</span><span style=3D"color: #008;" clas=
s=3D"styled-by-prettify">auto</span><span style=3D"color: #000;" class=3D"s=
tyled-by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-=
prettify">&[</span><span style=3D"color: #000;" class=3D"styled-by-pret=
tify">i</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"> val</span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">]</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"colo=
r: #660;" class=3D"styled-by-prettify">:</span><span style=3D"color: #000;"=
class=3D"styled-by-prettify"> std</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">::</span><span style=3D"color: #000;" class=3D"styl=
ed-by-prettify">counted_view</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify">rng</span><span style=3D"color: #660;" class=3D"styled-by-prettify=
">))</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></=
span><span style=3D"color: #660;" class=3D"styled-by-prettify">{...}</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span></div>=
</code></div><div><br></div><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></div><div><div><font face=3D"monospace, monospace">#in=
clude <iostream></font></div><div><font face=3D"monospace, monospace"=
>#include <vector></font></div><div><font face=3D"monospace, monospac=
e">#include <tuple></font></div><div><font face=3D"monospace, monospa=
ce"><br></font></div><div><font face=3D"monospace, monospace">int main()</f=
ont></div><div><font face=3D"monospace, monospace">{</font></div><div><font=
face=3D"monospace, monospace">=C2=A0 =C2=A0 std::vector<int> v =3D {=
6,5,4,3,2,1 };</font></div><div><font face=3D"monospace, monospace"><br></=
font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 for( auto=
[i, first, last] =3D std::make_tuple(std::size_t(0)<wbr>, begin(v), end(v)=
)</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0=
=C2=A0; first !=3D last</font></div><div><font face=3D"monospace, monospac=
e">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></div><div><font face=
=3D"monospace, monospace">=C2=A0 =C2=A0 {</font></div><div><font face=3D"mo=
nospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 std::cout << "in=
dex: " << i << "\t" << *first << &qu=
ot;\n";</font></div><div><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 }</font></div><div><font face=3D"monospace, monospace">}</font></div=
></div><div><br></div><div>It seems sensible to me to group the loop's =
variables in a structured binding since=C2=A0</div><div><br></div><ul><li>i=
t's succinct and,</li><li>they remain firmly local to the loop's sc=
ope</li><li>It's the only way to declare multiple dissimilar variables =
within the for statement.<br></li></ul><div><br></div><div>However, this co=
de is not DRY - the naming of the bound variables must correspond to the cr=
eation of the tuple. Maintenance confusion awaits.<br></div></div></blockqu=
ote><div><br></div><div>Perhaps you're mistaking DRY for some other pri=
nciple. DRY is Don't Repeat Yourself. This code involves no repetition =
of typenames, variable names, objects, literals, or anything else. Nothing =
is being repeated; there is simply distance between the "variable"=
; and its initializer.</div><div><br></div><div>That has nothing to do with=
repetition.<br></div><div><br></div><blockquote class=3D"gmail_quote" styl=
e=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left:=
1ex;"><div dir=3D"ltr"><div></div><div></div><div>It seems to me that a sm=
all, non-breaking syntax change could allow this:</div></div></blockquote><=
div><br></div><div>Structured binding should not be used as a quick-and-dir=
ty way to create multiple variables of different types in a place where tha=
t wasn't possible previously. And we <i>certainly</i> should not add sy=
ntax to encourage this.</div><div><br></div><div>Remember: they could have =
made `auto` do this exact thing when we standardized it in 2011. But the co=
mmittee expressly decided against it. All of the reasons for not allowing i=
t then are still just as valid now.<br></div><div><br></div><blockquote cla=
ss=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><div><fo=
nt face=3D"monospace, monospace">=C2=A0 =C2=A0 for( auto [i =3D size_t(0), =
first =3D begin(v), last =3D end(v)]</font></div><div><font face=3D"monospa=
ce, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; first !=3D last</font></div><di=
v><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++f=
irst)</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 {<=
/font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0 // ...</font></div><div><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 }</font></div></div><div><font face=3D"monospace, monospace"><br></f=
ont></div><div>which would:</div><div><br></div><div>a) <b>be 100% DRY</b>,=
</div><div>b) involve less typing</div></div></blockquote><div><br></div><d=
iv>59 characters vs. 79. That's not "much less", especially c=
ompared to the 45 characters in the range-based version.<br></div><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: =
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div=
>c) match the syntax for lambda capture (I could expand further on my thoug=
hts on that, but perhaps another day)<br></div><div>d) IMHO be easier to te=
ach</div></div></blockquote><div><br></div><div>This isn't something pe=
ople should be doing anyway. So why would we want it to be easy to teach?<b=
r></div><style>HTML {margin: 0px !important; border: medium none !important=
;}
..dragdrop-handle {cursor: move; -moz-user-select: none;}
..dragdrop-draggable { }
..dragdrop-dragging { }
..dragdrop-positioner {border: 1px dashed rgb(30, 144, 255); margin: 0px !im=
portant; z-index: 100;}
..dragdrop-flow-panel-positioner {color: rgb(30, 144, 255); display: inline;=
text-align: center; vertical-align: middle;}
..dragdrop-proxy {background-color: rgb(119, 170, 255);}
..dragdrop-selected ,.dragdrop-dragging ,.dragdrop-proxy {opacity: 0.3;}
..dragdrop-movable-panel {z-index: 200; margin: 0px !important; border: medi=
um none !important;}
..gb_8a {display: none !important;}
..gb_9a {visibility: hidden;}
..gb_5c {display: inline-block; padding: 0px 0px 0px 15px; vertical-align: m=
iddle;}
..gb_5c:first-child ,#gbsfw:first-child + .gb_5c {padding-left: 0px;}
..gb_Mc {position: relative;}
..gb_b {display: inline-block; outline: medium none; vertical-align: middle;=
border-radius: 2px; box-sizing: border-box; height: 30px; width: 30px; col=
or: rgb(0, 0, 0); cursor: pointer; text-decoration: none;}
#gb#gb a.gb_b {color: rgb(0, 0, 0); cursor: pointer; text-decoration: none;=
}
..gb_pb {border-color: transparent transparent rgb(255, 255, 255); border-st=
yle: dashed dashed solid; border-width: 0px 8.5px 8.5px; display: none; pos=
ition: absolute; left: 6.5px; top: 37px; z-index: 1; height: 0px; width: 0p=
x; animation: 0.2s ease 0s normal none 1 running gb__a;}
..gb_qb {border-color: transparent transparent rgba(0, 0, 0, 0.2); border-st=
yle: dashed dashed solid; border-width: 0px 8.5px 8.5px; display: none; pos=
ition: absolute; left: 6.5px; z-index: 1; height: 0px; width: 0px; animatio=
n: 0.2s ease 0s normal none 1 running gb__a; top: 36px;}
..gb_fa {background: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 1p=
x solid rgba(0, 0, 0, 0.2); color: rgb(0, 0, 0); box-shadow: 0px 2px 10px r=
gba(0, 0, 0, 0.2); display: none; outline: medium none; overflow: hidden; p=
osition: absolute; right: 0px; top: 44px; animation: 0.2s ease 0s normal no=
ne 1 running gb__a; border-radius: 2px; -moz-user-select: text;}
..gb_5c.gb_g .gb_pb ,.gb_5c.gb_g .gb_qb ,.gb_5c.gb_g .gb_fa ,.gb_g.gb_fa {di=
splay: block;}
..gb_5c.gb_g.gb_uf .gb_pb ,.gb_5c.gb_g.gb_uf .gb_qb {display: none;}
..gb_vf {position: absolute; right: 0px; top: 44px; z-index: -1;}
..gb_cb .gb_pb ,.gb_cb .gb_qb ,.gb_cb .gb_fa {margin-top: -10px;}
..gb_Ob .gb_qb {border-width: 1px 0px 0px 1px; border-style: solid none none=
solid; border-color: rgba(0, 0, 0, 0.2) currentcolor currentcolor rgba(0, =
0, 0, 0.2); -moz-border-top-colors: none; -moz-border-right-colors: none; -=
moz-border-bottom-colors: none; -moz-border-left-colors: none; border-image=
: none; height: 14px; width: 14px; transform: rotate(45deg);}
..gb_Ob .gb_pb {border-width: 1px 0px 0px 1px; border-style: solid none none=
solid; -moz-border-top-colors: none; -moz-border-right-colors: none; -moz-=
border-bottom-colors: none; -moz-border-left-colors: none; border-image: no=
ne; height: 14px; width: 14px; transform: rotate(45deg); border-color: rgb(=
255, 255, 255); background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..gb_da .gb_b {background-position: 0px -894px; opacity: 0.55;}
..gb_ea .gb_da .gb_b {background-position: 0px -894px;}
..gb_X .gb_da .gb_b {background-position: 0px -2180px; opacity: 1;}
..gb_fa.gb_ga {min-height: 196px; overflow-y: auto; width: 320px;}
..gb_ha {transition: height 0.2s ease-in-out 0s;}
..gb_ia {background: rgb(255, 255, 255) none repeat scroll 0% 0%; margin: 0p=
x; min-height: 100px; padding: 28px 27px 28px 28px; text-align: left; white=
-space: normal; width: 265px;}
..gb_ja {background: rgb(245, 245, 245) none repeat scroll 0% 0%; cursor: po=
inter; height: 40px; overflow: hidden;}
..gb_ka {position: relative;}
..gb_ja {display: block; line-height: 40px; text-align: center; width: 320px=
;}
..gb_ka {display: block; line-height: 40px; text-align: center;}
..gb_ka.gb_la {line-height: 0;}
..gb_ja ,.gb_ja:visited ,.gb_ja:active ,.gb_ka ,.gb_ka:visited {color: rgba(=
0, 0, 0, 0.87); text-decoration: none;}
..gb_ka:active {color: rgba(0, 0, 0, 0.87);}
#gb a.gb_ja ,#gb a.gb_ja:visited ,#gb a.gb_ja:active ,#gb a.gb_ka ,#gb a.gb=
_ka:visited {color: rgba(0, 0, 0, 0.87); text-decoration: none;}
#gb a.gb_ka:active {color: rgba(0, 0, 0, 0.87);}
..gb_ka ,.gb_ia {display: none;}
..gb_ba ,.gb_ba + .gb_ka ,.gb_ma .gb_ka ,.gb_ma .gb_ia {display: block;}
..gb_ka:hover ,.gb_ka:active ,#gb a.gb_ka:hover ,#gb a.gb_ka:active {text-de=
coration: underline;}
..gb_ka {border-bottom: 1px solid rgb(235, 235, 235); left: 28px; width: 264=
px;}
..gb_ma .gb_ja {display: none;}
..gb_ka:last-child {border-bottom-width: 0px;}
..gb_na .gb_O {display: initial;}
..gb_na.gb_oa {height: 100px; text-align: center;}
..gb_na.gb_oa img {padding: 34px 0px; height: 32px; width: 32px;}
..gb_na .gb_2 {background-image: url("//ssl.gstatic.com/gb/images/v1_da9d8cf=
f.png"); background-size: 92px 2835px; background-position: 0px -828px;}
..gb_na .gb_2 + img {border: 0px none; margin: 8px; height: 48px; width: 48p=
x;}
..gb_na div.gb_pa {background: rgb(255, 255, 170) none repeat scroll 0% 0%; =
border-radius: 5px; padding: 5px; text-align: center;}
..gb_na.gb_qa ,.gb_na.gb_ra {padding-bottom: 0px;}
..gb_na.gb_sa ,.gb_na.gb_ra {padding-top: 0px;}
..gb_na.gb_ra a ,.gb_na.gb_sa a {top: 0px;}
..gb_ta .gb_ja {margin-top: 0px; position: static;}
..gb_ua {display: inline-block;}
..gb_va {margin: -12px 28px 28px; position: relative; width: 264px; border-r=
adius: 2px; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1), 0px 0px 1px rgba(0,=
0, 0, 0.1);}
..gb_4 {background-image: url("//ssl.gstatic.com/gb/images/v1_da9d8cff.png")=
; background-size: 92px 2835px; display: inline-block; margin: 8px; vertica=
l-align: middle; height: 64px; width: 64px;}
..gb_wa {color: rgb(38, 38, 38); display: inline-block; font: 13px/18px Aria=
l,sans-serif; margin-right: 80px; padding: 10px 10px 10px 0px; vertical-ali=
gn: middle; white-space: normal;}
..gb_xa {font: 16px/24px Arial,sans-serif;}
..gb_ya ,#gb#gb .gb_ya {color: rgb(66, 127, 237); text-decoration: none;}
..gb_ya:hover ,#gb#gb .gb_ya:hover {text-decoration: underline;}
..gb_za .gb_ia {position: relative;}
..gb_za .gb_O {position: absolute; top: 28px; left: 28px;}
..gb_ja.gb_Aa {display: none; height: 0px;}
..gb_N .gb_da .gb_b::before ,.gb_N.gb_ea .gb_da .gb_b::before {left: 0px; to=
p: -894px;}
..gb_N.gb_X .gb_da .gb_b::before {left: 0px; top: -2180px;}
..gb_Ob .gb_ja {position: relative;}
..gb_da .gb_b:hover ,.gb_da .gb_b:focus {opacity: 0.85;}
..gb_X .gb_da .gb_b:hover ,.gb_X .gb_da .gb_b:focus {opacity: 1;}
#gb#gb a.gb_O ,#gb#gb a.gb_P ,#gb#gb span.gb_P {color: rgba(0, 0, 0, 0.87);=
text-decoration: none;}
#gb#gb a.gb_P:hover ,#gb#gb a.gb_P:focus {opacity: 0.85; text-decoration: u=
nderline;}
..gb_Q.gb_R {display: none; padding-left: 15px; vertical-align: middle;}
..gb_Q.gb_R:first-child {padding-left: 0px;}
..gb_S.gb_R {display: inline-block;}
..gb_Q span {opacity: 0.55; -moz-user-select: text;}
..gb_T .gb_S.gb_R {flex: 0 1 auto; display: flex;}
..gb_U .gb_S.gb_R {display: none;}
..gb_Q .gb_P {display: inline-block; line-height: 24px; outline: medium none=
; vertical-align: middle;}
..gb_S .gb_P {display: none;}
..gb_V .gb_S .gb_P {min-width: 0px;}
..gb_W .gb_S .gb_P {width: 0px !important;}
#gb#gb.gb_X a.gb_P ,#gb#gb.gb_X span.gb_P ,#gb#gb .gb_X a.gb_P ,#gb#gb .gb_=
X span.gb_P {color: rgb(255, 255, 255);}
#gb#gb.gb_X span.gb_P ,#gb#gb .gb_X span.gb_P {opacity: 0.7;}
..gb_M.gb_M {background-size: 64px 64px;}
#gb2 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/3a1e625196=
..png");}
..gb_N #gb2 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/3a1e6=
25196.png");}
#gb22 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/3daf4c1f8=
8.png");}
..gb_N #gb22 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/3daf=
4c1f88.png");}
#gb45 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/f420d06f6=
6.png");}
..gb_N #gb45 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/f420=
d06f66.png");}
#gb72 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/78b3d46de=
1.png");}
..gb_N #gb72 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/78b3=
d46de1.png");}
#gb117 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/142da275=
78.png");}
..gb_N #gb117 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/142=
da27578.png");}
#gb136 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/911e3628=
e6.png");}
..gb_N #gb136 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/911=
e3628e6.png");}
#gb166 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/41679a9e=
c5.png");}
..gb_N #gb166 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/416=
79a9ec5.png");}
#gb171 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/4244245d=
7e.png");}
..gb_N #gb171 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/424=
4245d7e.png");}
#gb177 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/4653513b=
7d.png");}
..gb_N #gb177 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/465=
3513b7d.png");}
#gb206 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/ad330d84=
59.png");}
..gb_N #gb206 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/ad3=
30d8459.png");}
#gb207 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/2c21041e=
16.png");}
..gb_N #gb207 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/2c2=
1041e16.png");}
#gb211 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/c03dda0b=
34.png");}
..gb_N #gb211 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/c03=
dda0b34.png");}
#gb217 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/71060be5=
b3.png");}
..gb_N #gb217 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/710=
60be5b3.png");}
#gb228 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/74aa55e0=
c2.png");}
..gb_N #gb228 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/74a=
a55e0c2.png");}
#gb249 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/afa40f6e=
42.png");}
..gb_N #gb249 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/afa=
40f6e42.png");}
#gb260 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/ea554714=
e7.png");}
..gb_N #gb260 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/ea5=
54714e7.png");}
#gb261 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/0b26f6f8=
e4.png");}
..gb_N #gb261 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/0b2=
6f6f8e4.png");}
#gb108 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/dfbeb247=
85.png");}
..gb_N #gb108 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/dfb=
eb24785.png");}
#gb60 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/85bb99a34=
1.png");}
..gb_N #gb60 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/85bb=
99a341.png");}
#gb175 .gb_M {background-image: url("//ssl.gstatic.com/gb/images/a/eacd033c=
28.png");}
..gb_N #gb175 .gb_M::before {content: url("//ssl.gstatic.com/gb/images/a/eac=
d033c28.png");}
..gb_Z {padding: 1px; display: inline-block; vertical-align: top; color: bla=
ck; z-index: 999; height: 98px; width: 86px;}
..gb_Z a {text-decoration: none;}
..gb_Z[aria-grabbed=3D"true"] {visibility: hidden;}
..gb_Z:hover {z-index: 1001;}
..gb_Z:hover a {border: 1px solid rgb(229, 229, 229); border-radius: 2px; ma=
rgin: 7px 1px;}
..gb_Z.gb_0 a {border: 1px solid rgb(229, 229, 229); box-shadow: 0px 1px 2px=
rgba(0, 0, 0, 0.1); background: rgb(255, 255, 255) none repeat scroll 0% 0=
%; cursor: grabbing; margin: -1px; visibility: visible; z-index: 1001;}
..gb_1 {opacity: 0.5;}
..gb_Z.gb_0 a {color: rgba(0, 0, 0, 0.87) !important; cursor: grabbing; font=
: 13px/27px Arial,sans-serif; text-decoration: none !important;}
..gb_O {color: rgba(0, 0, 0, 0.87); display: inline-block; font-size: 13px; =
margin: 8px 2px; text-align: center; outline: medium none;}
..gb_O .gb_2 ,.gb_O .gb_M {display: inline-block; vertical-align: top; heigh=
t: 64px; width: 64px;}
..gb_3 {display: block; line-height: 20px; overflow: hidden; white-space: no=
wrap; width: 84px; text-overflow: ellipsis;}
..gb_Z:hover .gb_O {z-index: 1;}
..gb_Z:hover .gb_3 {background: rgba(255, 255, 255, 0.9) none repeat scroll =
0% 0%; white-space: normal; overflow-wrap: break-word;}
..gb_O .gb_2 {background-image: url("//ssl.gstatic.com/gb/images/v1_da9d8cff=
..png"); background-size: 92px 2835px;}
..gb_N .gb_O .gb_2 ,.gb_N .gb_4.gb_2 {background-image: none; overflow: hidd=
en; position: relative;}
..gb_N .gb_O .gb_2::before ,.gb_N .gb_4.gb_2::before {content: url("//ssl.gs=
tatic.com/gb/images/v1_da9d8cff.png"); position: absolute;}
..gb_N .gb_M {background-image: none !important; position: relative;}
..gb_N .gb_M::before {left: 0px; position: absolute; top: 0px;}
..gb_5 .gb_O:focus ,#gb#gb .gb_5 a.gb_O:focus {text-decoration: underline;}
..gb_Z.gb_6[aria-grabbed=3D"true"] {visibility: visible;}
..gb_7 ,.gb_8 {position: relative; top: 27px; visibility: hidden;}
..gb_9 ,.gb_aa {left: 37px; visibility: hidden;}
..gb_7 {float: left; width: 0px; height: 0px; border-top: 5px solid transpar=
ent; border-bottom: 5px solid transparent; border-right: 5px solid rgb(66, =
115, 219);}
..gb_8 {float: right; width: 0px; height: 0px; border-top: 5px solid transpa=
rent; border-bottom: 5px solid transparent; border-left: 5px solid rgb(66, =
115, 219);}
..gb_9 {position: absolute; top: 0px; width: 0px; height: 0px; border-left: =
5px solid transparent; border-right: 5px solid transparent; border-bottom: =
5px solid rgb(66, 115, 219);}
..gb_aa {position: absolute; top: 59px; width: 0px; height: 0px; border-left=
: 5px solid transparent; border-right: 5px solid transparent; border-top: 5=
px solid rgb(66, 115, 219);}
ul.gb_ba li.gb_6:not(:first-child) .gb_7 ,ul.gb_ba li.gb_6:not(:nth-child(-=
n+3)) .gb_9 ,ul.gb_ba li.gb_6 .gb_8 ,ul.gb_ba li.gb_6 .gb_aa ,ul.gb_ca li.g=
b_6 .gb_7 ,ul.gb_ca li.gb_6 .gb_9 ,ul.gb_ca li.gb_6:not(:last-child) .gb_8 =
,ul.gb_ca li.gb_6:not(:nth-last-child(-n+3)) .gb_aa {visibility: visible;}
a.gb_Ba {border: medium none; color: rgb(66, 133, 244); cursor: default; fo=
nt-weight: bold; outline: medium none; position: relative; text-align: cent=
er; text-decoration: none; text-transform: uppercase; white-space: nowrap; =
-moz-user-select: none;}
a.gb_Ba:hover::after ,a.gb_Ba:focus::after {background-color: rgba(0, 0, 0,=
0.12); content: ""; height: 100%; left: 0px; position: absolute; top: 0px;=
width: 100%;}
a.gb_Ba:hover ,a.gb_Ba:focus {text-decoration: none;}
a.gb_Ba:active {background-color: rgba(153, 153, 153, 0.4); text-decoration=
: none;}
a.gb_Ca {background-color: rgb(66, 133, 244); color: rgb(255, 255, 255);}
a.gb_Ca:active {background-color: rgb(0, 67, 178);}
..gb_Da {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.16);}
..gb_Ba ,.gb_Ca ,.gb_Ea ,.gb_Fa {display: inline-block; line-height: 28px; p=
adding: 0px 12px; border-radius: 2px;}
..gb_Ea {background: rgb(248, 248, 248) none repeat scroll 0% 0%; border: 1p=
x solid rgb(198, 198, 198);}
..gb_Fa {background: rgb(248, 248, 248) none repeat scroll 0% 0%;}
..gb_Ea ,#gb a.gb_Ea.gb_Ea ,.gb_Fa {color: rgb(102, 102, 102); cursor: defau=
lt; text-decoration: none;}
#gb a.gb_Fa.gb_Fa {cursor: default; text-decoration: none;}
..gb_Fa {border: 1px solid rgb(66, 133, 244); font-weight: bold; outline: me=
dium none; background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , r=
gb(67, 135, 253), rgb(70, 131, 234)) repeat scroll 0% 0%;}
#gb a.gb_Fa.gb_Fa {color: rgb(255, 255, 255);}
..gb_Fa:hover {box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.15);}
..gb_Fa:active {box-shadow: 0px 2px 0px rgba(0, 0, 0, 0.15) inset; backgroun=
d: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgb(60, 122, 228), rg=
b(63, 118, 211)) repeat scroll 0% 0%;}
..gb_wf {display: inline-block; line-height: normal; position: relative; z-i=
ndex: 987;}
..gb_ab {background-size: 32px 32px; border-radius: 50%; display: block; mar=
gin: -1px; overflow: hidden; position: relative; height: 32px; width: 32px;=
z-index: 0;}
..gb_ab:hover ,.gb_ab:focus {box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.15);}
..gb_ab:active {box-shadow: 0px 2px 0px rgba(0, 0, 0, 0.15) inset;}
..gb_ab:active::after {background: rgba(0, 0, 0, 0.1) none repeat scroll 0% =
0%; border-radius: 50%; content: ""; display: block; height: 100%;}
..gb_bb {cursor: pointer; line-height: 30px; min-width: 30px; opacity: 0.75;=
overflow: hidden; vertical-align: middle; text-overflow: ellipsis;}
..gb_b.gb_bb {width: auto;}
..gb_bb:hover ,.gb_bb:focus {opacity: 0.85;}
..gb_cb .gb_bb ,.gb_cb .gb_db {line-height: 26px;}
#gb#gb.gb_cb a.gb_bb ,.gb_cb .gb_db {font-size: 11px; height: auto;}
..gb_eb {border-top: 4px solid rgb(0, 0, 0); border-left: 4px dashed transpa=
rent; border-right: 4px dashed transparent; display: inline-block; margin-l=
eft: 6px; opacity: 0.75; vertical-align: middle;}
..gb_fb:hover .gb_eb {opacity: 0.85;}
..gb_X .gb_bb ,.gb_X .gb_eb {opacity: 1;}
#gb#gb.gb_X.gb_X a.gb_bb ,#gb#gb .gb_X.gb_X a.gb_bb {color: rgb(255, 255, 2=
55);}
..gb_X.gb_X .gb_eb {border-top-color: rgb(255, 255, 255); opacity: 1;}
..gb_ea .gb_ab:hover ,.gb_X .gb_ab:hover ,.gb_ea .gb_ab:focus ,.gb_X .gb_ab:=
focus {box-shadow: 0px 1px 0px rgba(0, 0, 0, 0.15), 0px 1px 2px rgba(0, 0, =
0, 0.2);}
..gb_gb .gb_hb ,.gb_ib .gb_hb {position: absolute; right: 1px;}
..gb_hb.gb_R ,.gb_jb.gb_R ,.gb_fb.gb_R {flex: 0 1 auto;}
..gb_kb.gb_W .gb_bb {width: 30px !important;}
..gb_lb.gb_9a {display: none;}
..gb_mb.gb_8a {display: none;}
..gb_mb {background-color: rgb(204, 204, 204); height: 3px; overflow: hidden=
;}
..gb_nb {background-color: rgb(244, 180, 0); height: 100%; width: 50%; anima=
tion: 1.5s linear 0s normal none infinite running progressmove;}
..gb_bb ~ .gb_pb ,.gb_bb ~ .gb_qb {left: auto; right: 6.5px;}
..gb_rb {outline: medium none;}
..gb_rb.gb_sb {width: 320px;}
..gb_tb ,#gb a.gb_tb.gb_tb ,.gb_ub a ,#gb .gb_ub.gb_ub a {color: rgb(51, 102=
, 204); text-decoration: none;}
..gb_tb:active ,#gb a.gb_tb:active ,.gb_tb:hover ,#gb a.gb_tb:hover ,.gb_ub =
a:active ,#gb .gb_ub a:active ,.gb_ub a:hover ,#gb .gb_ub a:hover {text-dec=
oration: underline;}
..gb_vb {margin: 20px; white-space: nowrap;}
..gb_wb ,.gb_xb {display: inline-block; vertical-align: top;}
..gb_rb.gb_sb .gb_xb {max-width: 164px;}
..gb_wb {margin-right: 20px; position: relative;}
..gb_yb {border-radius: 50%; overflow: hidden;}
..gb_zb {background-size: 96px 96px; border: medium none; vertical-align: to=
p; height: 96px; width: 96px;}
..gb_lb {background: rgba(78, 144, 254, 0.7) none repeat scroll 0% 0%; botto=
m: 0px; color: rgb(255, 255, 255); font-size: 9px; font-weight: bold; left:=
0px; line-height: 9px; position: absolute; padding: 7px 0px; text-align: c=
enter; width: 96px;}
..gb_yb .gb_lb {background: rgba(0, 0, 0, 0.54) none repeat scroll 0% 0%;}
..gb_Ab {font-weight: bold; margin: -4px 0px 1px; text-overflow: ellipsis; o=
verflow: hidden;}
..gb_Cb {color: rgb(102, 102, 102); text-overflow: ellipsis; overflow: hidde=
n;}
..gb_ub {color: rgb(204, 204, 204); margin: 6px 0px;}
..gb_ub a {margin: 0px 10px;}
..gb_ub a:first-child {margin-left: 0px;}
..gb_ub a:last-child {margin-right: 0px;}
..gb_xb .gb_Db {background: rgb(77, 144, 254) none repeat scroll 0% 0%; bord=
er-color: rgb(48, 121, 237); font-weight: bold; margin: 10px 0px 0px; color=
: rgb(255, 255, 255);}
#gb .gb_xb a.gb_Db.gb_Db {color: rgb(255, 255, 255);}
..gb_xb .gb_Db:hover {background: rgb(53, 122, 232) none repeat scroll 0% 0%=
; border-color: rgb(47, 91, 183);}
..gb_Eb.gb_oa {border-top: medium none;}
..gb_Eb {background: rgb(245, 245, 245) none repeat scroll 0% 0%; border-top=
: 1px solid rgba(0, 0, 0, 0.2); border-color: rgba(0, 0, 0, 0.2); padding: =
10px 0px; width: 100%; display: table;}
..gb_Eb .gb_Db {margin: 0px 20px; white-space: nowrap;}
..gb_Eb > div {display: table-cell; text-align: right;}
..gb_Eb > div:first-child {text-align: left;}
..gb_Eb .gb_Fb {display: block; text-align: center;}
..gb_Hb .gb_pb {border-bottom-color: rgb(254, 249, 219);}
..gb_Ib {background: rgb(254, 249, 219) none repeat scroll 0% 0%; font-size:=
11px; padding: 10px 20px; white-space: normal;}
..gb_Ib b ,.gb_tb {white-space: nowrap;}
..gb_Lb {background: rgb(245, 245, 245) none repeat scroll 0% 0%; border-top=
: 1px solid rgba(0, 0, 0, 0.2); max-height: 230px; overflow: auto;}
..gb_Lb.gb_sb {max-height: 170px;}
..gb_Lb.gb_sb.gb_Mb {max-height: 124px;}
..gb_Nb {border-top: 1px solid rgba(0, 0, 0, 0.2); display: block; padding: =
10px 20px; position: relative; white-space: nowrap;}
..gb_Ob .gb_Nb:focus .gb_Pb {outline: 1px dotted rgb(255, 255, 255);}
..gb_Nb:hover {background: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..gb_Nb[selected=3D"true"] {overflow: hidden;}
..gb_Nb[selected=3D"true"] > .gb_Qb {background-color: rgba(117, 117, 117, 0=
..9);}
..gb_Nb[selected=3D"true"] > .gb_Rb {display: block; position: absolute; z-i=
ndex: 2;}
..gb_Rb::-moz-focus-inner {border: 0px none;}
..gb_Rb {background-color: transparent; border: medium none; color: rgb(255,=
255, 255); display: none; font-family: Roboto,Arial,sans-serif; font-weigh=
t: 400; font-size: 14px; height: 36px; min-width: 86px; text-align: center;=
top: 16px; width: auto;}
..gb_Nb[selected=3D"true"] > .gb_Rb:focus {background-color: rgba(0, 0, 0, 0=
..24); border-radius: 2px; outline: 0px none;}
..gb_Nb[selected=3D"true"] > .gb_Rb:hover ,.gb_Nb[selected=3D"true"] > .gb_R=
b:focus:hover {background-color: rgb(86, 86, 86); border-radius: 2px;}
..gb_Nb[selected=3D"true"] > .gb_Rb:active {border-radius: 2px; background-c=
olor: rgb(33, 33, 33);}
..gb_Sb {left: 0px; margin-left: 5%;}
..gb_Tb {margin-right: 5%; right: 0px;}
..gb_Nb:first-child ,.gb_Ub:first-child + .gb_Nb {border-top: 0px none;}
..gb_Ub {display: none;}
..gb_Vb {cursor: default;}
..gb_Vb:hover {background: transparent none repeat scroll 0% 0%;}
..gb_Wb {border: medium none; vertical-align: top; height: 48px; width: 48px=
;}
..gb_Pb {display: inline-block; margin: 6px 0px 0px 10px;}
..gb_rb.gb_sb .gb_Pb {max-width: 222px;}
..gb_Vb .gb_Wb ,.gb_Vb .gb_Pb {opacity: 0.4;}
..gb_Xb {color: rgb(0, 0, 0); text-overflow: ellipsis; overflow: hidden;}
..gb_Vb .gb_Xb {color: rgb(102, 102, 102);}
..gb_Zb {color: rgb(102, 102, 102); text-overflow: ellipsis; overflow: hidde=
n;}
..gb_0b {color: rgb(102, 102, 102); font-style: italic;}
..gb_Qb {background-color: transparent; height: 100%; left: 0px; position: a=
bsolute; text-align: center; top: 0px; width: 100%; z-index: 1;}
..gb_Rb:hover {background-color: rgba(100, 100, 100, 0.4);}
..gb_1b {background: rgb(245, 245, 245) none repeat scroll 0% 0%; border-top=
: 1px solid rgba(0, 0, 0, 0.2); display: block; padding: 10px 20px;}
..gb_2b {background-position: -35px -242px; display: inline-block; margin: 1=
px 0px; vertical-align: middle; height: 25px; width: 25px;}
..gb_N .gb_2b::before {left: -35px; top: -242px;}
..gb_3b {color: rgb(66, 127, 237); display: inline-block; padding: 0px 25px =
0px 10px; vertical-align: middle; white-space: normal;}
..gb_1b:hover .gb_3b {text-decoration: underline;}
..gb_Eb .gb_Db:hover {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); border-col=
or: rgb(198, 198, 198); color: rgb(34, 34, 34); background-color: rgb(255, =
255, 255); background-image: -moz-linear-gradient(center top , rgb(255, 255=
, 255), rgb(248, 248, 248));}
#gbsfw {min-width: 400px; overflow: visible;}
..gb_4b ,#gbsfw.gb_g {display: block; outline: medium none;}
#gbsfw.gb_pa iframe {display: none;}
..gb_5b {padding: 118px 0px; text-align: center;}
..gb_6b {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/gb/images/a/f5c=
dd88b65.png") no-repeat scroll center 0px; color: rgb(170, 170, 170); font-=
size: 13px; line-height: 20px; padding-top: 76px;}
..gb_6b a {color: rgb(66, 133, 244); text-decoration: none;}
..gb_kb:not(.gb_N) .gb_ab::before ,.gb_kb:not(.gb_N) .gb_zb::before {content=
: none;}
..gb_N .gb_ac .gb_cc::before {left: 0px; top: -1451px;}
..gb_N.gb_X .gb_ac .gb_cc::before {left: 0px; top: -2560px;}
..gb_N.gb_ea .gb_ac .gb_cc::before {left: 0px; top: -1206px;}
..gb_N .gb_Wa {background-image: none !important;}
..gb_N .gb_dc {visibility: visible;}
..gb_Ob .gb_fe span {background: transparent none repeat scroll 0% 0%;}
..gb_7b {min-width: 152px; overflow: hidden; position: relative; z-index: 98=
7;}
..gb_8b {position: absolute; padding: 0px 30px;}
..gb_9b .gb_8b {right: 100%; margin-right: -152px;}
..gb_ac {display: inline-block; outline: medium none; vertical-align: middle=
;}
..gb_bc .gb_ac {position: relative; top: 2px;}
..gb_ac .gb_cc ,.gb_Wa {display: block;}
..gb_dc {border: medium none; display: block; visibility: hidden;}
..gb_ac .gb_cc {background-position: 0px -1451px; height: 33px; width: 92px;=
}
..gb_Wa {background-repeat: no-repeat;}
..gb_X .gb_ac .gb_cc {background-position: 0px -2560px;}
..gb_ea .gb_ac .gb_cc {background-position: 0px -1206px; opacity: 0.54;}
..gb_Cc {background-position: -35px -1171px; opacity: 0.55; height: 100%; wi=
dth: 100%;}
..gb_b:hover .gb_Cc ,.gb_b:focus .gb_Cc {opacity: 0.85;}
..gb_Dc .gb_Cc {background-position: -35px -2180px;}
..gb_Ec {background-color: rgb(203, 68, 55); border-radius: 8px; font: bold =
11px/16px Arial; color: rgb(255, 255, 255); min-width: 14px; padding: 0px 1=
px; position: absolute; right: 0px; text-align: center; text-shadow: 0px 1p=
x 0px rgba(0, 0, 0, 0.1); top: 0px; visibility: hidden; z-index: 990;}
..gb_Fc .gb_Ec ,.gb_Fc .gb_Hc ,.gb_Fc .gb_Hc.gb_Ic {visibility: visible;}
..gb_Hc {padding: 0px 2px; visibility: hidden;}
..gb_Jc:not(.gb_Kc) .gb_qb ,.gb_Jc:not(.gb_Kc) .gb_pb {left: 3px;}
..gb_Ec.gb_Lc {animation: 0.6s ease-in-out 1s normal both 1 running gb__nb; =
perspective-origin: right top; transform: scale(1, 1); transform-origin: ri=
ght top 0px;}
..gb_Lc .gb_Hc {visibility: visible;}
..gb_ea .gb_b .gb_Cc {background-position: -21px -1731px; opacity: 0.7;}
..gb_ea .gb_Dc .gb_Cc {background-position: 0px -1558px;}
..gb_ea .gb_b:hover .gb_Cc ,.gb_ea .gb_b:focus .gb_Cc {opacity: 0.85;}
..gb_X .gb_b .gb_Cc {background-position: 0px -207px; opacity: 1;}
..gb_X .gb_Dc .gb_Cc {background-position: -35px -207px;}
..gb_ea .gb_Ec ,.gb_X .gb_Ec {border: medium none;}
..gb_Jc .gb_Mc {font-size: 14px; font-weight: bold; top: 0px; right: 0px;}
..gb_Jc .gb_b {display: inline-block; vertical-align: middle; box-sizing: bo=
rder-box; height: 30px; width: 30px;}
..gb_Jc .gb_pb {border-bottom-color: rgb(229, 229, 229);}
..gb_Nc {background-color: rgba(0, 0, 0, 0.55); color: rgb(255, 255, 255); f=
ont-size: 12px; font-weight: bold; line-height: 20px; margin: 5px; padding:=
0px 2px; text-align: center; box-sizing: border-box; border-radius: 50%; h=
eight: 20px; width: 20px;}
..gb_Nc.gb_Oc {background-position: -70px -1171px;}
..gb_Nc.gb_Pc {background-position: 0px -1835px;}
..gb_b:hover .gb_Nc ,.gb_b:focus .gb_Nc {background-color: rgba(0, 0, 0, 0.8=
5);}
#gbsfw.gb_Qc {background: rgb(229, 229, 229) none repeat scroll 0% 0%; bord=
er-color: rgb(204, 204, 204);}
..gb_ea .gb_Nc {background-color: rgba(0, 0, 0, 0.7);}
..gb_X .gb_Nc.gb_Nc ,.gb_X .gb_Fc .gb_Nc.gb_Nc ,.gb_X .gb_Fc .gb_b:hover .gb=
_Nc ,.gb_X .gb_Fc .gb_b:focus .gb_Nc {background-color: rgb(255, 255, 255);=
color: rgb(64, 64, 64);}
..gb_X .gb_Nc.gb_Oc {background-position: 0px -600px;}
..gb_X .gb_Nc.gb_Pc {background-position: -35px -479px;}
..gb_Fc .gb_Nc.gb_Nc {background-color: rgb(219, 68, 55); color: rgb(255, 25=
5, 255);}
..gb_Fc .gb_b:hover .gb_Nc ,.gb_Fc .gb_b:focus .gb_Nc {background-color: rgb=
(165, 39, 20);}
..gb_N .gb_Cc::before {left: -35px; top: -1171px;}
..gb_N .gb_Dc .gb_Cc::before {left: -35px; top: -2180px;}
..gb_N.gb_ea .gb_b .gb_Cc::before {left: -21px; top: -1731px;}
..gb_N.gb_ea .gb_Dc .gb_Cc::before {left: 0px; top: -1558px;}
..gb_N.gb_X .gb_b .gb_Cc::before {left: 0px; top: -207px;}
..gb_N.gb_X .gb_Dc .gb_Cc::before {left: -35px; top: -207px;}
..gb_Ob .gb_Nc {border: 1px solid rgb(255, 255, 255); color: rgb(255, 255, 2=
55);}
..gb_Ob.gb_ea .gb_Nc {border-color: rgb(0, 0, 0); color: rgb(0, 0, 0);}
..gb_N .gb_Nc.gb_Oc::before ,.gb_Ob.gb_N.gb_X .gb_Nc.gb_Oc::before {left: -7=
0px; top: -1171px;}
..gb_N .gb_Nc.gb_Pc::before ,.gb_Ob.gb_N.gb_X .gb_Nc.gb_Pc::before {left: 0p=
x; top: -1835px;}
..gb_N.gb_X .gb_Nc.gb_Oc::before ,.gb_Ob.gb_N.gb_ea .gb_Nc.gb_Oc::before {le=
ft: 0px; top: -600px;}
..gb_N.gb_X .gb_Nc.gb_Pc::before ,.gb_Ob.gb_N.gb_ea .gb_Nc.gb_Pc::before {le=
ft: -35px; top: -479px;}
..gb_ud {color: rgb(255, 255, 255); font-size: 13px; font-weight: bold; heig=
ht: 25px; line-height: 19px; padding-top: 5px; padding-left: 12px; position=
: relative; background-color: rgb(77, 144, 254);}
..gb_ud .gb_vd {color: rgb(255, 255, 255); cursor: default; font-size: 22px;=
font-weight: normal; position: absolute; right: 12px; top: 5px;}
..gb_ud .gb_ed ,.gb_ud .gb_wd {color: rgb(255, 255, 255); display: inline-bl=
ock; font-size: 11px; margin-left: 16px; padding: 0px 8px; white-space: now=
rap;}
..gb_xd {background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgba=
(0, 0, 0, 0.16), rgba(0, 0, 0, 0.2)) repeat scroll 0% 0%; border-radius: 2p=
x; border: 1px solid rgba(0, 0, 0, 0.1); cursor: default !important; text-d=
ecoration: none !important;}
..gb_xd:hover {background: rgba(0, 0, 0, 0) -moz-linear-gradient(center top =
, rgba(0, 0, 0, 0.14), rgba(0, 0, 0, 0.2)) repeat scroll 0% 0%; border: 1px=
solid rgba(0, 0, 0, 0.2); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);}
..gb_xd:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset;}
..gb_5c.gb_6c {padding: 0px;}
..gb_6c .gb_fa {padding: 26px 26px 22px 13px; background: rgb(255, 255, 255)=
none repeat scroll 0% 0%;}
..gb_7c.gb_6c .gb_fa {background: rgb(77, 144, 254) none repeat scroll 0% 0%=
;}
a.gb_8c {color: rgb(102, 102, 102) !important; font-size: 22px; height: 9px=
; opacity: 0.8; position: absolute; right: 14px; top: 4px; text-decoration:=
none !important; width: 9px;}
..gb_7c a.gb_8c {color: rgb(193, 209, 244) !important;}
a.gb_8c:hover ,a.gb_8c:active {opacity: 1;}
..gb_9c {padding: 0px; width: 258px; white-space: normal; display: table;}
..gb_ad .gb_fa {top: 36px; border: 0px none; padding: 16px; box-shadow: 4px =
4px 12px rgba(0, 0, 0, 0.4);}
..gb_ad .gb_9c {width: 328px;}
..gb_ad .gb_Fa ,.gb_ad .gb_bd ,.gb_ad .gb_4c ,.gb_ad .gb_Ba ,.gb_cd {line-he=
ight: normal; font-family: Roboto,RobotoDraft,Helvetica,Arial,sans-serif;}
..gb_ad .gb_Fa ,.gb_ad .gb_bd ,.gb_ad .gb_Ba {font-weight: 500;}
..gb_ad .gb_Fa ,.gb_ad .gb_Ba {border: 0px none; padding: 10px 8px;}
..gb_6c .gb_Fa:active {outline: medium none; box-shadow: 0px 4px 5px rgba(0,=
0, 0, 0.16);}
..gb_ad .gb_bd {color: rgb(34, 34, 34); margin-bottom: 8px;}
..gb_ad .gb_4c {color: rgb(128, 128, 128); font-size: 14px;}
..gb_dd {text-align: right; font-size: 14px; padding-bottom: 0px; white-spac=
e: nowrap;}
..gb_dd .gb_ed {margin-left: 8px;}
..gb_dd .gb_fd.gb_ed img {background-color: inherit; border-radius: initial;=
height: 1.5em; margin: -0.25em 10px -0.25em 2px; vertical-align: text-top;=
width: 1.5em;}
..gb_ad .gb_9c .gb_gd .gb_fd {border: 2px solid transparent;}
..gb_ad .gb_9c .gb_gd .gb_fd:focus {border-color: rgb(187, 204, 255);}
..gb_ad .gb_9c .gb_gd .gb_fd:focus::after ,.gb_ad .gb_9c .gb_gd .gb_fd:hover=
::after {background-color: transparent;}
..gb_cd {background-color: rgb(64, 64, 64); color: rgb(255, 255, 255); paddi=
ng: 16px; position: absolute; top: 36px; min-width: 328px; max-width: 650px=
; right: 0px; border-radius: 2px; box-shadow: 4px 4px 12px rgba(0, 0, 0, 0.=
4);}
..gb_cd a ,.gb_cd a:visited {color: rgb(94, 151, 246); text-decoration: none=
;}
..gb_hd {text-transform: uppercase;}
..gb_id {padding-left: 50px;}
..gb_7c .gb_9c {width: 200px;}
..gb_bd {color: rgb(51, 51, 51); font-size: 16px; line-height: 20px; margin:=
0px 0px 16px;}
..gb_7c .gb_bd {color: rgb(255, 255, 255);}
..gb_4c {color: rgb(102, 102, 102); line-height: 17px; margin: 0px 0px 5px;}
..gb_7c .gb_4c {color: rgb(255, 255, 255);}
..gb_kd {text-decoration: none; color: rgb(94, 151, 246);}
..gb_kd:visited {color: rgb(94, 151, 246);}
..gb_kd:hover ,.gb_kd:active {text-decoration: underline;}
..gb_ld {position: absolute; background: transparent none repeat scroll 0% 0=
%; top: -999px; z-index: -1; visibility: hidden; margin-top: 1px; margin-le=
ft: 1px;}
#gb .gb_6c {margin: 0px;}
..gb_6c .gb_Db {background: rgb(77, 144, 254) none repeat scroll 0% 0%; bord=
er-color: rgb(48, 121, 237); margin-top: 15px;}
..gb_ad .gb_Fa {background: rgb(66, 133, 244) none repeat scroll 0% 0%;}
#gb .gb_6c a.gb_Db.gb_Db {color: rgb(255, 255, 255);}
..gb_6c .gb_Db:hover {background: rgb(53, 122, 232) none repeat scroll 0% 0%=
; border-color: rgb(47, 91, 183);}
..gb_md .gb_Mc .gb_pb {border-bottom-color: rgb(255, 255, 255); display: blo=
ck;}
..gb_nd .gb_Mc .gb_pb {border-bottom-color: rgb(77, 144, 254); display: bloc=
k;}
..gb_md .gb_Mc .gb_qb ,.gb_nd .gb_Mc .gb_qb {display: block;}
..gb_od ,.gb_gd {display: table-cell;}
..gb_od {vertical-align: middle;}
..gb_ad .gb_od {vertical-align: top;}
..gb_gd {padding-left: 13px; width: 100%;}
..gb_ad .gb_gd {padding-left: 20px;}
..gb_pd {display: inline-block; padding: 1em 0px 0px; position: relative; wi=
dth: 100%;}
..gb_qd {color: rgb(255, 0, 0); font-style: italic; margin: 0px; padding-lef=
t: 46px;}
..gb_pd .gb_rd {float: right; margin: -20px 0px; width: calc(100% - 46px);}
..gb_sd svg {fill: grey;}
..gb_sd.gb_td svg {fill: rgb(66, 133, 244);}
..gb_pd .gb_rd label::after {background-color: rgb(66, 133, 244);}
..gb_sd {display: inline; float: right; margin-right: 22px; position: relati=
ve; top: -4px;}
..gb_xf {margin-bottom: 32px; font-size: small;}
..gb_xf .gb_yf {margin-right: 5px;}
..gb_xf .gb_zf {color: red;}
..gb_Tc {display: none;}
..gb_Tc.gb_g {display: block;}
..gb_Uc {background-color: rgb(255, 255, 255); box-shadow: 0px 1px 0px rgba(=
0, 0, 0, 0.08); color: rgb(0, 0, 0); position: relative; z-index: 986;}
..gb_Vc {height: 40px; padding: 16px 24px; white-space: nowrap;}
..gb_Wc {position: fixed; bottom: 16px; padding: 16px; right: 16px; white-sp=
ace: normal; width: 328px; transition: width 0.2s ease 0s, bottom 0.2s ease=
0s, right 0.2s ease 0s; border-radius: 2px; box-shadow: 0px 5px 5px -3px r=
gba(0, 0, 0, 0.2), 0px 8px 10px 1px rgba(0, 0, 0, 0.14), 0px 3px 14px 2px r=
gba(0, 0, 0, 0.12);}
..gb_Uc .gb_Db {border: 0px none; font-weight: 500; font-size: 14px; line-he=
ight: 36px; min-width: 32px; padding: 0px 16px; vertical-align: middle;}
..gb_Uc .gb_Db::before {content: ""; height: 6px; left: 0px; position: absol=
ute; top: -6px; width: 100%;}
..gb_Uc .gb_Db::after {bottom: -6px; content: ""; height: 6px; left: 0px; po=
sition: absolute; width: 100%;}
..gb_Uc .gb_Db + .gb_Db {margin-left: 8px;}
..gb_Xc {height: 48px; padding: 4px; margin: -8px 0px 0px -8px;}
..gb_Wc .gb_Xc {float: left; margin: -4px;}
..gb_Zc {font-family: Roboto,RobotoDraft,Helvetica,Arial,sans-serif; overflo=
w: hidden; vertical-align: top;}
..gb_Vc .gb_Zc {display: inline-block; padding-left: 8px; width: 640px;}
..gb_Wc .gb_Zc {display: block; margin-left: 56px; padding-bottom: 16px;}
..gb_0c {background-color: inherit;}
..gb_Vc .gb_0c {display: inline-block; position: absolute; top: 18px; right:=
24px;}
..gb_Wc .gb_0c {text-align: right; padding-right: 24px; padding-top: 6px;}
..gb_0c .gb_1c {height: 1.5em; margin: -0.25em 10px -0.25em 0px; vertical-al=
ign: text-top; width: 1.5em;}
..gb_2c {line-height: 20px; font-size: 16px; font-weight: 700; color: rgba(0=
, 0, 0, 0.87);}
..gb_Wc .gb_2c {color: rgba(0, 0, 0, 0.87); font-size: 16px; line-height: 20=
px; padding-top: 8px;}
..gb_Vc .gb_2c ,.gb_Vc .gb_3c {width: 640px;}
..gb_3c .gb_4c ,.gb_3c {line-height: 20px; font-size: 13px; font-weight: 400=
; color: rgba(0, 0, 0, 0.54);}
..gb_Wc .gb_3c .gb_4c {font-size: 14px;}
..gb_Wc .gb_3c {padding-top: 12px;}
..gb_Wc .gb_3c a {color: rgb(66, 133, 244);}
..gb_Af {position: relative; width: 650px; z-index: 986;}
#gbq2 {padding-top: 15px;}
..gb_T .gb_Af {min-width: 200px; flex: 0 2 auto;}
..gb_V ~ .gb_Af {min-width: 0px;}
..gb_T #gbqf {margin-right: 0px; display: flex;}
..gb_T .gbqff {min-width: 0px; flex: 1 1 auto;}
..gb_N .gbqfi::before {left: 0px; top: -479px;}
..gb_Ob .gbqfb:focus .gbqfi {outline: 1px dotted rgb(255, 255, 255);}
#gbq2 {display: block;}
#gbqf {display: block; margin: 0px 60px 0px 0px; white-space: nowrap;}
..gbqff {border: medium none; display: inline-block; margin: 0px; padding: 0=
px; vertical-align: top; width: 100%;}
..gbqfqw ,#gbqfb ,.gbqfwa {vertical-align: top;}
#gbqfaa ,#gbqfab ,#gbqfqwb {position: absolute;}
#gbqfaa {left: 0px;}
#gbqfab {right: 0px;}
..gbqfqwb ,.gbqfqwc {right: 0px; left: 0px; height: 100%;}
..gbqfqwb {padding: 0px 8px;}
#gbqfbw {display: inline-block; vertical-align: top;}
#gbqfb {border: 1px solid transparent; border-bottom-left-radius: 0px; bord=
er-top-left-radius: 0px; height: 30px; margin: 0px; outline: medium none; p=
adding: 0px; width: 60px; box-shadow: none; box-sizing: border-box; backgro=
und: rgba(0, 0, 0, 0) -moz-linear-gradient(center top , rgb(67, 135, 253), =
rgb(70, 131, 234)) repeat scroll 0% 0%;}
#gbqfb:hover {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);}
#gbqfb:focus {box-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.5) inset;}
#gbqfb:hover:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) inset, 0=
px 1px 1px rgba(0, 0, 0, 0.1);}
#gbqfb:active:active {border: 1px solid transparent; box-shadow: 0px 2px 0p=
x rgba(0, 0, 0, 0.15) inset; background: rgba(0, 0, 0, 0) -moz-linear-gradi=
ent(center top , rgb(60, 122, 228), rgb(63, 118, 211)) repeat scroll 0% 0%;=
}
..gbqfi {background-position: 0px -479px; display: inline-block; margin: -1p=
x; height: 30px; width: 30px;}
..gbqfqw {background: rgb(255, 255, 255) none repeat scroll 0% 0% padding-bo=
x; border-width: 1px 0px 1px 1px; border-style: solid; -moz-border-top-colo=
rs: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; =
-moz-border-left-colors: none; border-image: none; border-color: rgba(0, 0,=
0, 0.15); height: 30px; box-sizing: border-box;}
#gbfwc .gbqfqw {border-right-width: 1px;}
#gbqfqw {position: relative;}
..gbqfqw.gbqfqw:hover {border-color: rgba(0, 0, 0, 0.3);}
..gbqfwa {display: inline-block; width: 100%;}
..gbqfwb {width: 40%;}
..gbqfwc {width: 60%;}
..gbqfwb .gbqfqw {margin-left: 10px;}
..gbqfqw.gbqfqw:active ,.gbqfqw.gbqfqwf.gbqfqwf {border-color: rgb(66, 133, =
244);}
#gbqfq ,#gbqfqb ,#gbqfqc {background: transparent none repeat scroll 0% 0%;=
border: medium none; height: 20px; margin-top: 4px; padding: 0px; vertical=
-align: top; width: 100%;}
#gbqfq:focus ,#gbqfqb:focus ,#gbqfqc:focus {outline: medium none;}
..gbqfif ,.gbqfsf {color: rgb(34, 34, 34); font: 16px arial,sans-serif;}
#gbqfbwa {display: none; text-align: center; height: 0px;}
#gbqfbwa .gbqfba {margin: 16px 8px;}
#gbqfsa ,#gbqfsb {font: bold 11px/27px Arial,sans-serif !important; vertica=
l-align: top;}
..gb_ea .gbqfqw.gbqfqw ,.gb_X .gbqfqw.gbqfqw {border-color: rgb(255, 255, 25=
5); box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);}
..gb_ea #gbqfb ,.gb_X #gbqfb {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.2);}
..gb_ea #gbqfb:hover ,.gb_X #gbqfb:hover {box-shadow: 0px 1px 1px rgba(0, 0,=
0, 0.1), 0px 1px 2px rgba(0, 0, 0, 0.2);}
..gb_ea #gbqfb:active ,.gb_X #gbqfb:active {box-shadow: 0px 2px 0px rgba(0, =
0, 0, 0.15) inset, 0px 1px 2px rgba(0, 0, 0, 0.2);}
..gbqfb ,.gbqfba ,.gbqfbb {cursor: default !important; display: inline-block=
; font-weight: bold; height: 29px; line-height: 29px; min-width: 54px; padd=
ing: 0px 8px; text-align: center; text-decoration: none !important; border-=
radius: 2px; -moz-user-select: none;}
..gbqfba:focus {border: 1px solid rgb(77, 144, 254); outline: medium none; b=
ox-shadow: 0px 0px 0px 1px rgba(255, 255, 255, 0.5) inset;}
..gbqfba:hover {border-color: rgb(198, 198, 198); color: rgb(34, 34, 34) !im=
portant; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); background: rgba(0, 0,=
0, 0) -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(241, 241, =
241)) repeat scroll 0% 0%;}
..gbqfba:hover:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) inset, =
0px 1px 1px rgba(0, 0, 0, 0.1);}
..gbqfb::-moz-focus-inner {border: 0px none;}
..gbqfba::-moz-focus-inner {border: 0px none;}
..gbqfba {border: 1px solid rgba(0, 0, 0, 0.1); color: rgb(68, 68, 68) !impo=
rtant; font-size: 11px; background: rgba(0, 0, 0, 0) -moz-linear-gradient(c=
enter top , rgb(245, 245, 245), rgb(241, 241, 241)) repeat scroll 0% 0%;}
..gbqfba:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..gb_Bf .gb_b {background-position: -35px -2805px; opacity: 0.55; height: 30=
px; width: 30px;}
..gb_Bf .gb_b:hover ,.gb_Bf .gb_b:focus {opacity: 0.85;}
..gb_Bf .gb_pb {border-bottom-color: rgb(245, 245, 245);}
#gbsfw.gb_Cf {background: rgb(245, 245, 245) none repeat scroll 0% 0%; bord=
er-color: rgb(204, 204, 204);}
..gb_X .gb_Bf .gb_b {background-position: 0px -1171px; opacity: 1;}
..gb_ea .gb_Bf .gb_b {background-position: -52px -859px; opacity: 0.7;}
..gb_ea .gb_Bf .gb_b:hover ,.gb_ea .gb_Bf .gb_b:focus {opacity: 0.85;}
..gb_N .gb_Bf .gb_b::before {left: -35px; top: -2805px;}
..gb_N.gb_ea .gb_Bf .gb_b::before {left: -52px; top: -859px;}
..gb_N.gb_X .gb_Bf .gb_b::before {left: 0px; top: -1171px;}
..gb_3f {width: 480px;}
..gb_4f {background: rgba(0, 0, 0, 0.04) none repeat scroll 0% 0%; border-bo=
ttom-right-radius: 0px; line-height: 30px; position: relative; text-align: =
center; width: 100%;}
..gb_4f:hover {background: rgba(0, 0, 0, 0.08) none repeat scroll 0% 0%;}
..gb_4f .gb_5f {margin: 0px 10px;}
..gb_6f {position: relative; z-index: 1;}
..gb_7f {background: rgb(238, 238, 238) none repeat scroll 0% 0%; border-bot=
tom: 1px solid rgb(227, 227, 227); border-left: 1px solid rgb(227, 227, 227=
); display: inline-block; line-height: 32px; text-align: center; width: 160=
px;}
..gb_6f .gb_7f:first-child {border-left: medium none;}
..gb_6f .gb_g {background: rgb(255, 255, 255) none repeat scroll 0% 0%; bord=
er-bottom: medium none;}
..gb_8f {display: none; text-align: center;}
..gb_8f.gb_g {display: block;}
..gb_9f {color: inherit; display: inline-block; padding: 15px; text-decorati=
on: none;}
..gb_ag {background-clip: content-box; background-origin: content-box; displ=
ay: inherit; height: 64px; width: 64px;}
..gb_bg {display: block; text-align: center;}
..gb_cg {border-top: medium none; top: 78px; z-index: 1; border-radius: 0px =
0px 2px 2px;}
..gb_dg {display: inline-block; vertical-align: middle;}
..gb_eg {display: inline-block; vertical-align: middle; background-size: 100=
% auto; height: 20px; width: 20px;}
..gb_fg {background-image: url("//ssl.gstatic.com/gb/images/a/5a1c013d3d.png=
");}
..gb_gg {background-image: url("//ssl.gstatic.com/gb/images/a/de580e5330.png=
");}
..gb_hg {background-image: url("//ssl.gstatic.com/gb/images/a/451603daf6.png=
");}
..gb_dg {margin-left: 4px;}
..gb_ig {margin: 5px; width: 470px;}
..gb_jg {border: medium none; display: block; margin: 0px 5px; outline: medi=
um none; padding: 0px 5px; height: 30px; width: 450px;}
..gb_kg {border-width: 1px medium medium; border-style: solid none none; bor=
der-color: rgb(227, 227, 227) currentcolor currentcolor; -moz-border-top-co=
lors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none=
; -moz-border-left-colors: none; border-image: none; display: block; margin=
: 0px 5px; outline: medium none; padding: 0px 5px; height: 30px; width: 450=
px;}
..gb_lg {border-color: rgb(227, 227, 227); display: block; font: inherit; ma=
rgin: 0px 5px; outline: medium none; padding: 5px; text-align: left; height=
: 320px; width: 450px;}
..gb_mg ,.gb_ng {border: 1px solid rgb(227, 227, 227); border-radius: 2px; c=
ursor: pointer; line-height: 27px; margin: 5px; padding: 0px 8px; width: 54=
px;}
..gb_mg {float: left;}
..gb_ng {float: right;}
..gb_yg {color: rgb(0, 0, 0); font: 13px/27px Arial,sans-serif; left: 0px; m=
in-width: 1117px; position: absolute; top: 0px; -moz-user-select: none; wid=
th: 100%;}
..gb_Ef {font: 13px/27px Arial,sans-serif; position: relative; height: 60px;=
width: 100%;}
..gb_cb .gb_Ef {height: 28px;}
#gba {height: 60px;}
#gba.gb_cb {height: 28px;}
#gba.gb_zg {height: 90px;}
#gba.gb_Ag {height: 132px;}
#gba.gb_zg.gb_cb {height: 58px;}
..gb_Ef > .gb_R {height: 60px; line-height: 58px; vertical-align: middle;}
..gb_cb .gb_Ef > .gb_R {height: 28px; line-height: 26px;}
..gb_Ef::before {background: rgb(229, 229, 229) none repeat scroll 0% 0%; bo=
ttom: 0px; content: ""; display: none; height: 1px; left: 0px; position: ab=
solute; right: 0px;}
..gb_Ef {background: rgb(241, 241, 241) none repeat scroll 0% 0%;}
..gb_Bg .gb_Ef {background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..gb_Bg .gb_Ef::before ,.gb_cb .gb_Ef::before {display: none;}
..gb_ea .gb_Ef ,.gb_X .gb_Ef ,.gb_cb .gb_Ef {background: transparent none re=
peat scroll 0% 0%;}
..gb_ea .gb_Ef::before {background: rgba(0, 0, 0, 0.12) none repeat scroll 0=
% 0%;}
..gb_X .gb_Ef::before {background: rgba(255, 255, 255, 0.2) none repeat scro=
ll 0% 0%;}
..gb_R {display: inline-block; flex: 0 0 auto;}
..gb_R.gb_Cg {float: right; order: 1;}
..gb_Dg {white-space: nowrap;}
..gb_T .gb_Dg {display: flex;}
..gb_Dg ,.gb_R {margin-left: 0px !important; margin-right: 0px !important;}
..gb_cc {background-image: url("//ssl.gstatic.com/gb/images/v1_da9d8cff.png"=
); background-size: 92px 2835px;}
..gb_kb {min-width: 255px; padding-left: 30px; padding-right: 30px; position=
: relative; text-align: right; z-index: 986; align-items: center; justify-c=
ontent: flex-end; -moz-user-select: none;}
..gb_cb .gb_kb {min-width: 0px;}
..gb_kb.gb_R {flex: 1 1 auto;}
..gb_Ac {line-height: normal; position: relative; text-align: left;}
..gb_Ac.gb_R ,.gb_je.gb_R ,.gb_db.gb_R {flex: 0 1 auto;}
..gb_og ,.gb_pg {display: inline-block; padding: 0px 0px 0px 15px; position:=
relative; vertical-align: middle;}
..gb_je {line-height: normal; padding-right: 15px;}
..gb_kb .gb_je.gb_U {padding-right: 0px;}
..gb_db {color: rgb(64, 64, 64); line-height: 30px; min-width: 30px; overflo=
w: hidden; vertical-align: middle; text-overflow: ellipsis;}
#gb.gb_cb.gb_cb .gb_Vf ,#gb.gb_cb.gb_cb .gb_Ac > .gb_pg .gb_Wf {background:=
rgba(0, 0, 0, 0) none repeat scroll 0% 0%; border: medium none; color: rgb=
(51, 102, 204); cursor: pointer; filter: none; font-size: 11px; line-height=
: 26px; padding: 0px; box-shadow: none;}
#gb.gb_cb.gb_X .gb_Vf ,#gb.gb_cb.gb_X .gb_Ac > .gb_pg .gb_Wf {color: rgb(25=
5, 255, 255);}
..gb_cb .gb_Vf {text-transform: uppercase;}
..gb_kb.gb_V {padding-left: 0px; padding-right: 29px;}
..gb_kb.gb_qg {max-width: 400px;}
..gb_rg {background-clip: content-box; background-origin: content-box; opaci=
ty: 0.27; padding: 22px; height: 16px; width: 16px;}
..gb_rg.gb_R {display: none;}
..gb_rg:hover ,.gb_rg:focus {opacity: 0.55;}
..gb_sg {background-position: 0px -1313px;}
..gb_tg {background-position: 0px -1731px; padding-left: 30px; padding-right=
: 14px; position: absolute; right: 0px; top: 0px; z-index: 990;}
..gb_gb:not(.gb_ib) .gb_tg ,.gb_V .gb_sg {display: inline-block;}
..gb_gb .gb_sg {padding-left: 30px; padding-right: 0px; width: 0px;}
..gb_gb:not(.gb_ib) .gb_ug {display: none;}
..gb_kb.gb_R.gb_V ,.gb_V:not(.gb_ib) .gb_Ac {flex: 0 0 auto;}
..gb_rg ,.gb_V .gb_je ,.gb_ib .gb_Ac {overflow: hidden;}
..gb_gb .gb_je {padding-right: 0px;}
..gb_V .gb_Ac {padding: 1px 1px 1px 0px;}
..gb_gb .gb_Ac {width: 75px;}
..gb_kb.gb_vg ,.gb_kb.gb_vg .gb_sg ,.gb_kb.gb_vg .gb_sg::before ,.gb_kb.gb_v=
g .gb_je ,.gb_kb.gb_vg .gb_Ac {transition: width 0.5s ease-in-out 0s, min-w=
idth 0.5s ease-in-out 0s, max-width 0.5s ease-in-out 0s, padding 0.5s ease-=
in-out 0s, left 0.5s ease-in-out 0s;}
..gb_T .gb_kb {min-width: 0px;}
..gb_kb.gb_W ,.gb_kb.gb_W .gb_Ac ,.gb_kb.gb_wg ,.gb_kb.gb_wg .gb_Ac {min-wid=
th: 0px !important;}
..gb_kb.gb_W ,.gb_kb.gb_W .gb_R {flex: 0 0 auto !important;}
..gb_kb.gb_W .gb_db {width: 30px !important;}
..gb_xg {margin-right: 32px;}
..gb_9a {display: none;}
..gb_N .gb_sg::before {clip: rect(1313px, 16px, 1329px, 0px); left: 22px; to=
p: -1291px;}
..gb_N .gb_cc.gb_tg {position: absolute;}
..gb_N .gb_tg::before {clip: rect(1731px, 16px, 1747px, 0px); left: 30px; to=
p: -1709px;}
..gb_N .gb_gb .gb_sg::before {left: 30px;}
..gb_N .gb_cc ,.gb_N .gbii ,.gb_N .gbip {background-image: none; overflow: h=
idden; position: relative;}
..gb_N .gb_cc::before {content: url("//ssl.gstatic.com/gb/images/v1_da9d8cff=
..png"); position: absolute;}
..gb_Ob a:focus {outline: 1px dotted rgb(255, 255, 255) !important;}
sentinel { }
#gbq .gbgt-hvr ,#gbq .gbgt:focus {background-color: transparent; background=
-image: none;}
#gbq1.gbqfh {display: none;}
..gbxx {display: none !important;}
#gbq {line-height: normal; position: relative; top: 0px; white-space: nowra=
p;}
#gbq {left: 0px; width: 100%;}
#gbq2 {top: 0px; z-index: 986;}
#gbq4 {display: inline-block; max-height: 29px; overflow: hidden; position:=
relative;}
#gbq2.gbqfh {z-index: 985;}
#gbq2.gbqfh {margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin=
-left: 0px !important; padding-top: 0px; position: relative; top: 310px;}
..gbqfh #gbqf {margin: auto; min-width: 534px; padding: 0px !important;}
..gbqfh #gbqfbw {display: none;}
..gbqfh #gbqfbwa {display: block;}
..gbqfh #gbqf {max-width: 512px; min-width: 200px;}
..gbqfh .gbqfqw {border-right-width: 1px;}
..gbii::before {content: url("https://lh3.googleusercontent.com/-D_q2LHjgmDw=
/AAAAAAAAAAI/AAAAAAAAAAA/AFiYof0TQAS8681YLD-G8eHGnINuCxGv7g/s32-c-mo/photo.=
jpg");}
..gbip::before {content: url("https://lh3.googleusercontent.com/-D_q2LHjgmDw=
/AAAAAAAAAAI/AAAAAAAAAAA/AFiYof0TQAS8681YLD-G8eHGnINuCxGv7g/s96-c-mo/photo.=
jpg");}
..gbii {background-image: url("https://lh3.googleusercontent.com/-D_q2LHjgmD=
w/AAAAAAAAAAI/AAAAAAAAAAA/AFiYof0TQAS8681YLD-G8eHGnINuCxGv7g/s32-c-mo/photo=
..jpg");}
..gbip {background-image: url("https://lh3.googleusercontent.com/-D_q2LHjgmD=
w/AAAAAAAAAAI/AAAAAAAAAAA/AFiYof0TQAS8681YLD-G8eHGnINuCxGv7g/s96-c-mo/photo=
..jpg");}
..gb_va .gb_2::before {left: 0px; top: -790px;}
#gb192 .gb_2::before {left: 0px; top: -1593px;}
#gb1 .gb_2::before {left: 0px; top: -341px;}
#gb8 .gb_2::before {left: 0px; top: -2215px;}
#gb36 .gb_2::before {left: 0px; top: -2491px;}
#gb78 .gb_2::before {left: 0px; top: -2284px;}
#gb5 .gb_2::before {left: 0px; top: -2667px;}
#gb23 .gb_2::before {left: 0px; top: -2422px;}
#gb49 .gb_2::before {left: 0px; top: -69px;}
#gb24 .gb_2::before {left: 0px; top: -1766px;}
#gb119 .gb_2::before {left: 0px; top: -721px;}
#gb51 .gb_2::before {left: 0px; top: -1382px;}
#gb31 .gb_2::before {left: 0px; top: -1244px;}
#gb6 .gb_2::before {left: 0px; top: -1973px;}
#gb212 .gb_2::before {left: -21px; top: -1313px;}
#gb27 .gb_2::before {left: 0px; top: -514px;}
#gb25 .gb_2::before {left: 0px; top: -2111px;}
#gb10 .gb_2::before {left: 0px; top: -138px;}
#gb30 .gb_2::before {left: 0px; top: 0px;}
#gb53 .gb_2::before {left: -25px; top: -1835px;}
#gb300 .gb_2::before {left: 0px; top: -272px;}
#gb265 .gb_2::before {left: 0px; top: -2598px;}
..F0XO1GC-e-b {bottom: 24px; left: 24px; position: fixed; z-index: 2000;}
..F0XO1GC-e-b .F0XO1GC-e-a {background: rgb(50, 50, 50) none repeat scroll 0=
% 0%; border-radius: 2px; color: white; display: inline-block; font-size: 1=
4px; max-width: 568px; min-width: 288px; padding: 16px 24px 12px; will-chan=
ge: transform;}
..F0XO1GC-e-b .F0XO1GC-e-a > div {vertical-align: middle; display: inline-bl=
ock; max-width: 450px;}
..F0XO1GC-e-b .F0XO1GC-e-a > div > div {overflow: hidden; text-overflow: ell=
ipsis;}
..F0XO1GC-e-b .F0XO1GC-e-a .F0XO1GC-e-i {color: rgb(161, 194, 250); text-tra=
nsform: uppercase;}
..F0XO1GC-e-b.F0XO1GC-e-d .F0XO1GC-e-c {float: right; opacity: 0.8; padding-=
left: 10px;}
..F0XO1GC-e-b.F0XO1GC-e-d .F0XO1GC-e-c:hover {opacity: 1;}
..F0XO1GC-e-g {transition: opacity 4s ease 0s;}
..F0XO1GC-e-j {transition: opacity 6s ease 0s;}
..F0XO1GC-e-e {opacity: 0;}
body.F0XO1GC-e-m .F0XO1GC-e-b.F0XO1GC-e-f {display: none;}
..F0XO1GC-g-b {background-color: rgb(235, 238, 248); padding: 4px; color: rg=
b(34, 34, 34); box-shadow: 0px 4px 10px rgb(139, 139, 139);}
..F0XO1GC-g-a {height: 14px; width: 6px; overflow: hidden; background: rgba(=
0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAYAAAAOCAYA=
AAAMn20lAAAAH0lEQVR4XmNYsGDBahBmgAI4H6cE6QBd63C0Yyc2CQCkTVFv9KQgxwAAAABJRU5=
ErkJggg=3D=3D") no-repeat scroll 0px 0px; display: inline-block;}
..gux-dropdown-c {background-color: rgb(249, 249, 249); border-width: 1px; b=
order-style: solid; border-color: rgb(229, 229, 229) rgb(229, 229, 229) rgb=
(179, 179, 179);}
..gux-dropdown-b {border-bottom: 1px solid rgb(229, 229, 229); margin-left: =
2px;}
..gux-combo-item {color: rgb(51, 51, 51); cursor: pointer; padding: 3px 8px;=
}
..gux-combo-item-disabled {color: rgb(102, 102, 102);}
..gux-combo-item-selected ,.gux-combo-item-selection {background-color: rgb(=
221, 221, 221);}
..gux-combo-item-current {background-color: rgb(238, 238, 238); font-weight:=
bold;}
..gux-combo-item-has-child {background-image: url("data:image/png;base64,iVB=
ORw0KGgoAAAANSUhEUgAAAAcAAAAHAQMAAAD+nMWQAAAABlBMVEX///9mZmaO7mygAAAAAXRSTl=
MAQObYZgAAABxJREFUeF4FwTEBAAAMAiCiGMHTY/1zDUTNmcoDCSIBTWrzi7sAAAAASUVORK5CY=
II=3D");}
..gux-combo-item-has-child {background-repeat: no-repeat; background-positio=
n: 97% 50%; padding-right: 20px;}
..gux-combo-item-separator {margin: 3px 0px; border-top: 1px solid rgb(207, =
207, 207);}
..F0XO1GC-l-a {overflow: auto; max-height: 400px; min-width: 150px;}
html ,body ,div ,span ,applet ,object ,body {margin: 0px; padding: 0px; bor=
der: 0px none;}
iframe {margin: 0px; padding: 0px;}
h1 ,h2 ,h3 ,h4 ,h5 ,h6 ,p ,pre ,a ,abbr ,acronym ,address ,big ,cite ,code =
,del ,dfn ,em ,font ,img ,ins ,kbd ,q ,s ,samp ,small ,strike ,strong ,sub =
,sup ,tt ,var ,dl ,dt ,dd ,fieldset ,form ,label ,legend ,table ,caption ,t=
body ,tfoot ,thead ,tr ,th ,td {margin: 0px; padding: 0px; border: 0px none=
;}
body {background: white none repeat scroll 0% 0%;}
table {border-collapse: separate; border-spacing: 0px;}
caption ,th ,td {font-weight: normal;}
input::-moz-focus-inner {border: 0px none;}
body {font-family: "Arial","Helvetica",sans-serif; color: rgb(34, 34, 34); =
font-size: 13px; height: 100%; background-color: rgb(255, 255, 255);}
html {height: 100%; background-color: rgb(255, 255, 255);}
body {overflow-y: hidden; overflow-x: auto;}
..F0XO1GC-b-q {position: fixed; overflow: hidden; width: 100%; height: 100%;=
}
h1 ,h2 ,h3 ,h4 ,h5 {font-size: 16px; line-height: 24px; font-weight: normal=
; color: rgb(34, 34, 34);}
li {line-height: 17px;}
a {text-decoration: none; color: rgb(17, 85, 204); cursor: pointer;}
a:visited {color: rgb(102, 17, 204);}
a:active {color: rgb(209, 72, 54);}
iframe {border: 0px none;}
strong {font-weight: bold; color: rgb(34, 34, 34);}
em {font-style: italic;}
input[type=3D"text"] ,input[type=3D"password"] ,textarea ,.editable ,body {=
border-width: 1px; border-style: solid; border-color: rgb(192, 192, 192) rg=
b(217, 217, 217) rgb(217, 217, 217); -moz-border-top-colors: none; -moz-bor=
der-right-colors: none; -moz-border-bottom-colors: none; -moz-border-left-c=
olors: none; border-image: none; vertical-align: top; box-sizing: border-bo=
x; border-radius: 1px;}
input[type=3D"text"] ,input[type=3D"password"] {background-color: rgb(255, =
255, 255); color: rgb(34, 34, 34); display: inline-block; height: 29px; lin=
e-height: 27px; padding-left: 8px;}
textarea ,.editable ,body {padding: 5px;}
input[type=3D"text"]:hover ,input[type=3D"password"]:hover ,textarea:hover =
,.editable:hover {border-width: 1px; border-style: solid; border-color: rgb=
(160, 160, 160) rgb(185, 185, 185) rgb(185, 185, 185); -moz-border-top-colo=
rs: none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; =
-moz-border-left-colors: none; border-image: none; box-shadow: 0px 1px 2px =
rgba(0, 0, 0, 0.1) inset;}
input[type=3D"text"]:focus ,input[type=3D"password"]:focus ,textarea:focus =
,.editable:focus {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset; outline=
: medium none; border: 1px solid rgb(77, 144, 254);}
input[disabled] ,input[disabled]:hover ,textarea[disabled] ,textarea[disabl=
ed]:hover {border-width: 1px; border-style: solid; border-color: rgb(192, 1=
92, 192) rgb(217, 217, 217) rgb(217, 217, 217); -moz-border-top-colors: non=
e; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-bo=
rder-left-colors: none; border-image: none; box-shadow: none;}
..F0XO1GC-b-V ,.F0XO1GC-b-V:hover ,.F0XO1GC-b-V:focus {border: 1px solid rgb=
(221, 75, 57) !important;}
..F0XO1GC-b-R {color: rgb(221, 75, 57);}
..F0XO1GC-b-Hb textarea ,.F0XO1GC-b-Hb input[type=3D"text"] {width: 100%; ma=
x-width: 600px;}
..F0XO1GC-b-Hb textarea {height: 100px;}
..F0XO1GC-b-Jb:first-child {border-top: medium none;}
..F0XO1GC-b-Jb:last-child {border-bottom: 1px solid rgb(235, 235, 235);}
..F0XO1GC-b-Jb {border-top: 1px solid rgb(235, 235, 235); padding: 20px 0px;=
clear: both;}
..F0XO1GC-b-N .F0XO1GC-b-Jb {padding: 12px 0px;}
..F0XO1GC-b-O .F0XO1GC-b-Jb ,body .F0XO1GC-b-Jb {padding: 7px 0px;}
..F0XO1GC-b-Jb p {line-height: 13px;}
..F0XO1GC-b-Ib {padding-bottom: 0px; border: medium none;}
..F0XO1GC-b-Fb {display: block; float: left; width: 185px; font-weight: bold=
;}
..F0XO1GC-b-Fb a {font-size: 11px;}
..F0XO1GC-b-Gb {font-size: 11px; color: rgb(102, 102, 102); font-weight: nor=
mal;}
..F0XO1GC-b-Eb {margin-left: 210px;}
#gbqfq {border: medium none !important; box-shadow: none !important; line-h=
eight: normal !important;}
..F0XO1GC-b-w {position: absolute; width: 100%; text-align: center; height: =
0px;}
..F0XO1GC-b-w .gux-confirm-panel-c {display: inline-block; box-shadow: 0px 2=
px 4px rgba(0, 0, 0, 0.2);}
..gux-confirm-panel-r1 ,.gux-confirm-panel-r2 ,.gux-confirm-panel-r3 ,.gux-c=
onfirm-panel-r4 {display: none;}
..gux-confirm-panel-c {padding: 7px 16px !important; background: rgb(249, 23=
7, 190) none repeat scroll 0% 0% !important; border: 1px solid rgb(240, 195=
, 109); border-radius: 2px; line-height: 16px; font-size: 11px; position: r=
elative;}
..gux-confirm-panel-c a ,.gux-confirm-panel-c a:visited {color: rgb(51, 51, =
51); text-decoration: underline;}
..gux-confirm-panel-c a:hover {color: rgb(32, 32, 32);}
..gux-confirm-panel-message {color: inherit !important; font-weight: inherit=
!important;}
..F0XO1GC-b-y {text-align: center; padding: 16px;}
..F0XO1GC-b-y .gux-confirm-panel-c {display: inline-block;}
..F0XO1GC-b-o {position: relative; overflow: hidden; height: 58px; border-bo=
ttom: 1px solid rgb(235, 235, 235);}
..F0XO1GC-b-O .F0XO1GC-b-o ,body .F0XO1GC-b-o {min-height: 44px; height: 44p=
x;}
..F0XO1GC-b-p {font-size: 20px; position: absolute; left: 44px; top: 18px;}
..F0XO1GC-b-N .F0XO1GC-b-p {left: 28px;}
..F0XO1GC-b-O .F0XO1GC-b-p ,body .F0XO1GC-b-p {font-size: 16px; left: 16px; =
top: 11px;}
..F0XO1GC-b-dc .F0XO1GC-b-p ,body .F0XO1GC-b-p {left: 30px;}
..F0XO1GC-b-p ,.F0XO1GC-b-p a ,.F0XO1GC-b-p a:hover ,.F0XO1GC-b-p a:visited =
{color: rgb(221, 75, 57);}
..F0XO1GC-b-n {position: relative; font-size: 20px; font-weight: normal; col=
or: rgb(34, 34, 34); white-space: nowrap; overflow: hidden; margin-top: 14p=
x; min-height: 30px; margin-right: 44px;}
..F0XO1GC-b-N .F0XO1GC-b-n {margin-right: 28px;}
..F0XO1GC-b-O .F0XO1GC-b-n ,body .F0XO1GC-b-n {margin-top: 8px; margin-right=
: 16px;}
..F0XO1GC-b-dc .F0XO1GC-b-n ,body .F0XO1GC-b-n {margin-right: 30px;}
..F0XO1GC-b-m {position: absolute; left: 50px; top: 40px; font-size: 10px; p=
adding: 1px;}
..F0XO1GC-b-X {color: rgb(102, 102, 102);}
..F0XO1GC-b-W {background-color: rgb(249, 237, 190); border-radius: 6px;}
..F0XO1GC-b-W a {color: rgb(34, 34, 34); padding: 7px;}
..F0XO1GC-b-N .F0XO1GC-b-m {left: 34px;}
..F0XO1GC-b-O .F0XO1GC-b-m ,body .F0XO1GC-b-m {font-size: 8px; left: 21px; t=
op: 31px;}
..F0XO1GC-b-dc .F0XO1GC-b-m ,body .F0XO1GC-b-m {left: 36px;}
..F0XO1GC-b-Yb {display: inline-block; font-size: 16px; line-height: 24px; f=
ont-weight: normal; color: rgb(34, 34, 34);}
..F0XO1GC-b-Yb:focus {outline: medium none;}
..F0XO1GC-b-xb {height: 16px; margin-top: 4px;}
..F0XO1GC-b-yb {margin-right: 10px;}
..F0XO1GC-b-Rb {height: 32px; position: relative;}
..F0XO1GC-b-E {padding: 16px 44px 16px 0px;}
..F0XO1GC-b-N .F0XO1GC-b-E {padding: 16px 28px 16px 0px;}
..F0XO1GC-b-O .F0XO1GC-b-E ,body .F0XO1GC-b-E {padding: 7px 16px 7px 0px;}
..F0XO1GC-b-dc .F0XO1GC-b-E ,body .F0XO1GC-b-E {padding-right: 30px;}
..F0XO1GC-b-t {font-weight: bold; white-space: nowrap; margin-right: 4px; ve=
rtical-align: middle;}
..F0XO1GC-b-Zb {display: inline-block; width: 17px; z-index: 10; cursor: poi=
nter; text-align: center; position: relative;}
..F0XO1GC-b-j {display: inline-block;}
..F0XO1GC-b-Y {cursor: pointer; position: absolute; right: 5px; top: 5px;}
..F0XO1GC-b-Bb {font-size: 11px; color: rgb(102, 102, 102);}
..F0XO1GC-b-Cb {color: rgb(102, 102, 102);}
..F0XO1GC-b-jb ,.F0XO1GC-b-Mb ,.F0XO1GC-b-sb {color: rgb(17, 85, 204); text-=
decoration: none; cursor: pointer; white-space: nowrap;}
..F0XO1GC-b-Mb {font-size: 11px;}
..F0XO1GC-b-sb {padding-left: 8px;}
..F0XO1GC-b-wb[role=3D"listbox"] {z-index: 10000;}
..F0XO1GC-b-k {padding-right: 18px;}
..F0XO1GC-b-nb {font-weight: bold; cursor: pointer;}
#gbar ,#guser {padding-top: 4px !important;}
#gbar {padding-left: 8px;}
#guser {padding-right: 5px;}
..gwt-PopupGlass ,.gwt-PopupPanelGlass ,.modal-dialog-bg {background-color: =
rgb(255, 255, 255); opacity: 0.75; z-index: 1020; position: absolute; top: =
0px; bottom: 0px; left: 0px; right: 0px;}
..gwt-PopupPanel ,.gwt-SuggestBoxPopup ,.modal-dialog ,.F0XO1GC-b-i {z-index=
: 1021;}
..gwt-SuggestBoxPopup ,.gwt-PopupPanel ,.modal-dialog {background: rgb(255, =
255, 255) none repeat scroll 0% 0%; transition: opacity 0.218s ease 0s;}
..gwt-SuggestBoxPopup ,.F0XO1GC-b-i {min-width: 384px; padding: 0px; box-sha=
dow: 0px 2px 4px rgba(0, 0, 0, 0.2);}
..gwt-PopupPanel ,.modal-dialog {box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.2)=
;}
..gwt-SuggestBoxPopup ,.gwt-PopupPanel ,.modal-dialog ,.F0XO1GC-b-i {outline=
: medium none; border: 1px solid rgb(204, 204, 204);}
..gwt-SuggestBoxPopup table {width: 100%;}
..gwt-SuggestBoxPopup .item {font-size: 13px; line-height: 30px; color: rgb(=
51, 51, 51); padding: 2px 44px 2px 16px;}
..gwt-SuggestBoxPopup .item-selected {background-color: rgb(238, 238, 238);}
..gwt-SuggestBoxPopup .menuSeparatorInner {height: 1px; background-color: rg=
b(235, 235, 235);}
..gux-comboPopup {z-index: 1022;}
..F0XO1GC-b-a {margin-right: 1em; cursor: pointer; padding: 4px 5px 4px 0px;=
display: inline-block; vertical-align: middle; color: rgb(102, 102, 102);}
..F0XO1GC-b-e {cursor: pointer; padding: 4px 5px 4px 0px; display: inline-bl=
ock; vertical-align: middle; color: rgb(102, 102, 102);}
..F0XO1GC-b-a:hover ,.F0XO1GC-b-e:hover {color: rgb(51, 51, 51);}
..F0XO1GC-b-a span ,.F0XO1GC-b-e span {white-space: nowrap; vertical-align: =
middle;}
..F0XO1GC-b-c {vertical-align: middle; margin-right: 2px; float: left; posit=
ion: relative; top: -2px; opacity: 0.667;}
..F0XO1GC-b-a:hover .F0XO1GC-b-c ,.F0XO1GC-b-e:hover .F0XO1GC-b-c {opacity: =
1;}
..F0XO1GC-b-d {padding-right: 1em;}
..F0XO1GC-b-b ,.F0XO1GC-b-b span {text-decoration: none; color: rgb(119, 119=
, 119);}
..F0XO1GC-b-Lb {height: 16px; width: 14px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCA=
YAAAAmlE46AAAAnklEQVR4XmNQVFRcoKik+J8kDNTDgCFIJKaaxgtKSkoNIAxkfwBhJP4FnBpBC=
higAKYBmU99jcDQ2qCgouCgoKBgAHMeGh+HRgj+AFIIMgSNjxJtGBoVlBUCFJQUClD4ygoJ6Oow=
NBKLydcIdoay4gFFSLyhKgCJY8EgPbDQZoBqhmtCkcQHkDR+AAUIujxOAHMuKOjR5fACcOSToAk=
Alg7ZcpKQZvMAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;}
..F0XO1GC-b-Db > a .F0XO1GC-b-Lb ,body > a .F0XO1GC-b-Lb {height: 16px; widt=
h: 14px; overflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png=
;base64,iVBORw0KGgoAAAANSUhEUgAAAA4AAAAQCAYAAAAmlE46AAAAmUlEQVR4XmO4722xAIj=
/k4gXMGARJApTTeOF+z4WDWDsbfEBjBH8C7g1AhUwQAFMAwqf+hq9LTcAFTjc97IygDsPlY9LIx=
h/ACsEGYLCR402TI2+lgFATQUofC+LBHR1mBqJxBRoBDnDy+LAfUi8oSoAiWPHCbDQBhkA0oysC=
SGJDyBp/AAKEHR5nADuXGDQo8vhBeB4I0ETADumhjt9vOGeAAAAAElFTkSuQmCC") no-repeat=
scroll 0px 0px;}
..F0XO1GC-b-T {height: 13px; width: 13px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/gif;base64,R0lGODlhDQANAKIAAP///+/v7+vr68rKyr6=
+vpqammVlZQAAACH5BAEHAAMALAAAAAANAA0AAAM2ODpU/oWsUQK4N5RZrvkGsC0d9onNYwKhY4=
le7GBdiIml+GLCfKWQSO42UgxpnN2lNwFCJIsEADs=3D") no-repeat scroll 0px 0px; di=
splay: inline-block; margin-left: 4px;}
..gwt-HintingTextBox-hinting {color: rgb(136, 136, 136);}
..F0XO1GC-b-ab {color: rgb(170, 170, 170) !important;}
..F0XO1GC-b-tb {white-space: nowrap; display: inline;}
..F0XO1GC-b-U {color: red; vertical-align: baseline; font-size: 0.83em; posi=
tion: relative; top: -0.4em;}
..F0XO1GC-b-Kb {border: 0px none; overflow: hidden;}
..F0XO1GC-b-K {position: relative; top: -1px; border-style: solid dashed das=
hed; border-color: rgb(51, 102, 204) transparent transparent; display: inli=
ne-block; font-size: 0px; height: 0px; line-height: 0; width: 0px; border-w=
idth: 3px 3px 0px; padding-top: 1px; left: 4px;}
..F0XO1GC-b-x {text-align: center;}
..F0XO1GC-b-bc {width: 90%; left: 5% !important; z-index: 1020;}
..F0XO1GC-b-cc {color: rgb(255, 255, 255); background-color: rgb(0, 0, 0); o=
pacity: 0.9; border-radius: 10px; padding: 1em; width: 100%;}
..F0XO1GC-b-Qb {white-space: nowrap; padding: 0px 2px; font-size: 11px;}
..F0XO1GC-b-Qb img {position: relative; top: 1px; right: 2px; vertical-align=
: bottom;}
..F0XO1GC-b-l ,.F0XO1GC-b-qb {color: rgb(64, 178, 91);}
..F0XO1GC-b-L {color: rgb(238, 68, 68);}
..F0XO1GC-b-r {color: rgb(238, 68, 68); font-size: 13px;}
..F0XO1GC-b-s {font-size: 13px; padding-left: 2em;}
..F0XO1GC-b-S ,.F0XO1GC-b-fb ,.F0XO1GC-b-mb {color: rgb(238, 68, 68);}
..F0XO1GC-b-lb {display: inline-block;}
..F0XO1GC-b-lb img {vertical-align: bottom;}
..F0XO1GC-b-eb {border-top: 1px solid rgb(235, 235, 235); margin-top: 9px; m=
argin-bottom: 10px;}
..gux-comboPopup ,.ac-renderer {transition: opacity 0.218s ease 0s; box-shad=
ow: 0px 2px 4px rgba(0, 0, 0, 0.2);}
..gux-dropdown-c ,.ac-renderer {background-color: rgb(255, 255, 255); outlin=
e: 1px solid rgba(0, 0, 0, 0.2); padding: 6px 0px; white-space: nowrap;}
..gux-dropdown-c {box-shadow: none;}
..ac-renderer {position: absolute;}
..F0XO1GC-b-gb {padding-left: 32px !important;}
..gux-dropdown-c ,.ac-renderer {border: 1px solid rgb(204, 204, 204);}
..gux-combo-item ,.ac-renderer > div {display: block; padding: 6px 44px 6px =
16px; position: relative; color: rgb(51, 51, 51); font-size: 13px; font-wei=
ght: normal; cursor: pointer; line-height: 17px; transition: background 0.1=
3s ease 0s;}
..F0XO1GC-b-N .gux-combo-item ,.F0XO1GC-b-N .ac-renderer > div {padding: 4px=
28px 4px 16px;}
..F0XO1GC-b-O .gux-combo-item ,.F0XO1GC-b-O .ac-renderer > div ,body .gux-co=
mbo-item ,body .ac-renderer > div {padding: 2px 16px;}
..F0XO1GC-b-dc .gux-combo-item ,.F0XO1GC-b-dc .ac-render > div ,body .gux-co=
mbo-item ,body .ac-render > div {padding-right: 30px;}
..gux-combo-item:focus {outline: medium none !important;}
..gux-combo-item img {opacity: 0.667;}
..gux-combo-item:hover img {opacity: 1;}
..gux-combo-item-selected ,.gux-combo-item-selection ,.ac-active {background=
-color: rgb(241, 241, 241); color: rgb(34, 34, 34); outline: medium none !i=
mportant;}
..gux-combo-item-separator {border-top: 1px solid rgb(235, 235, 235); margin=
-top: 6px; margin-bottom: 6px;}
..gux-combo-item-disabled {color: rgb(153, 153, 153);}
..gux-combo-item-disabled img {opacity: 0.667;}
..F0XO1GC-b-J {overflow: hidden; background: rgba(0, 0, 0, 0) url("data:imag=
e/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAI0lEQVR4XmOIjI=
z8z4AMQAIogjABuCCyAFgQpwoUM+AcIAAA2BAgobr+lh4AAAAASUVORK5CYII=3D") no-repea=
t scroll 0px 0px; display: inline-block; width: 5px; height: 7px; transitio=
n: all 0.218s ease 0s; transform: rotate(90deg); opacity: 0.8;}
..F0XO1GC-b-Db .F0XO1GC-b-J ,body .F0XO1GC-b-J {height: 7px; width: 4px; ove=
rflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,iVBO=
Rw0KGgoAAAANSUhEUgAAAAQAAAAHCAYAAAAvZezQAAAAI0lEQVR4XmO46235nwEZgARQBGECcEF=
kAbAgThUoZsA5QAAAMl4mARgGem4AAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;=
}
..F0XO1GC-b-C .F0XO1GC-b-J {transform: rotate(0deg);}
..F0XO1GC-b-C .F0XO1GC-b-J {transform: rotate(0deg);}
..F0XO1GC-b-C .F0XO1GC-b-J {transform: rotate(0deg);}
..F0XO1GC-b-C .F0XO1GC-b-J { }
..F0XO1GC-b-F {overflow-y: scroll !important;}
..F0XO1GC-b-G {padding-right: 28px;}
..F0XO1GC-b-N .F0XO1GC-b-G {padding-right: 12px;}
..F0XO1GC-b-O .F0XO1GC-b-G ,body .F0XO1GC-b-G {padding-right: 0px;}
..F0XO1GC-b-dc .F0XO1GC-b-G ,body .F0XO1GC-b-G {padding-right: 14px;}
..F0XO1GC-b-ob {padding: 16px 28px 16px 0px;}
..F0XO1GC-b-N .F0XO1GC-b-ob {padding: 16px 12px 16px 0px;}
..F0XO1GC-b-O .F0XO1GC-b-ob ,body .F0XO1GC-b-ob {padding: 7px 0px;}
..F0XO1GC-b-v {position: absolute; right: 44px; top: 3px; font-size: 11px; c=
olor: rgb(136, 136, 136);}
..F0XO1GC-b-v a ,.F0XO1GC-b-v a:visited {color: rgb(136, 170, 238);}
..F0XO1GC-b-v a:hover {color: rgb(17, 85, 204);}
..F0XO1GC-b-Ab {position: relative;}
..F0XO1GC-b-Nb ,.F0XO1GC-b-Nb .F0XO1GC-b-q {background-color: rgb(245, 245, =
245);}
..gwt-TabBar {border-bottom: 1px solid rgb(204, 204, 204);}
..gwt-TabBarItem {min-width: 54px; text-align: center; color: rgb(102, 102, =
102); font-size: 11px; font-weight: bold; height: 27px; padding: 0px 8px; l=
ine-height: 27px; margin-bottom: -1px; border: 1px solid transparent; curso=
r: default; border-top-left-radius: 2px; border-top-right-radius: 2px;}
..gwt-TabBarItem:hover {color: rgb(34, 34, 34);}
..gwt-TabBarItem:focus {outline: medium none; color: rgb(51, 51, 51);}
..gwt-TabBarItem:active {color: rgb(51, 51, 51);}
..gwt-TabBarItem-selected {color: rgb(32, 32, 32); background-color: rgb(255=
, 255, 255); border-width: 1px; border-style: solid; border-color: rgb(204,=
204, 204) rgb(204, 204, 204) rgb(255, 255, 255); -moz-border-top-colors: n=
one; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-=
border-left-colors: none; border-image: none;}
..gwt-TabBarFirst-wrapper {display: none;}
..gwt-ScrollTable td {height: 40px; line-height: 40px; padding: 0px 8px; bor=
der-bottom: 1px solid rgb(235, 235, 234); overflow: hidden; text-overflow: =
ellipsis; white-space: nowrap;}
..F0XO1GC-b-N .gwt-ScrollTable td {height: 34px; line-height: 34px;}
..F0XO1GC-b-O .gwt-ScrollTable td ,body .gwt-ScrollTable td {height: 30px; l=
ine-height: 30px;}
..gwt-ScrollTable .headerTable td {color: rgb(102, 102, 102); cursor: defaul=
t; border-bottom: 1px solid rgb(204, 204, 204);}
..gwt-ScrollTable .headerTable td:hover {color: rgb(34, 34, 34);}
..gwt-ScrollTable .headerTable td:active {color: rgb(51, 51, 51);}
..F0XO1GC-b-P {padding: 12px;}
..F0XO1GC-b-zb {position: absolute; left: -10000px;}
..F0XO1GC-b-u {display: block;}
..F0XO1GC-b-kb {height: 16px; width: 16px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/gif;base64,R0lGODlhEAAQAPeQANHR0fX19aampvDw8O=
/v7+zs7CgoKGBgYPf395iYmMPDw4CAgDMzM8LCwtbW1vv7+4SEhIWFhbe3t6Ojo25ubltbW+vr6=
+fn51paWjs7O0VFRXx8fKKiopubm7m5uUNDQ97e3pKSkqqqqvHx8W1tbc3NzTk5OYyMjEtLS4+P=
jzAwMKSkpO3t7ebm5ri4uG9vb5qamlhYWAkJCcjIyMzMzBgYGAUFBUpKStPT0zExMWRkZLq6ur6=
+vq+vr09PTzY2NgEBAfr6+vT09BkZGR0dHUdHR1ZWVmdnZ8/Pz9nZ2RYWFlNTU7a2tpmZma2trZ=
GRkUZGRsTExOPj4729vaioqAICAk1NTeDg4KmpqaGhoenp6SkpKcXFxR4eHtzc3EhISKCgoO7u7=
rKysl5eXp6eni8vL7W1tSMjI1JSUsfHx3p6eioqKiEhIeHh4T09PVBQUOXl5bOzs0lJSc7OzsrK=
ymZmZvPz88vLy2hoaEFBQT8/P3t7e9/f3z4+PpeXlx8fHxAQEAgICMbGxqysrOrq6jo6OvLy8tv=
b20BAQFVVVdTU1OLi4qurq8HBwf39/QAAAP///wAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQJAACQACwAAAAA=
EAAQAAAIfgAhCRzogYGJBgMTQoqy4A4kA48eZVAoUFCZR3kOqYioAZKjAY4GRogoI4GCDyhKQAo=
ggMBABz6GjGlBMUDIgYR6FKCoEEGHCQ94KkwRkYNQSAAaQRr5KMHRpJAKnAgx4qjVq44CCLWZkI=
AArQpZuhz48SYAAALLHm2k9OrVgAAh+QQJAACQACwAAAAAEAAQAAAIfgAhCRzoAMMBEAMTKqzw6=
BGFIGCWCAgyMA0FGoZINNzwRMkjJVgGxnj0RsKFBRAsGGj46MBAMVDMWEiYZQ2QLRIGXsBSQCEk=
EVZ2+BzqsxEAogIBNBJoFCkkpU6jShXoKADRAI4SEhBgVWEAAQQSOhqQ9elRSGPLDm20dCrSgAA=
h+QQJAACQACwAAAAAEAAQAAAIfQAhCRyIoMOEBwMTKkzx6BEHSA0WzEnoaIAjSBEaJqDz41EhRQ=
MJCAgAqcCJECP2VGkIY6Ajkgq9GKmBgY/Cm5C09GCBE6cHBiYaQGoEoCckAw0zDC3aU0VDDUYHK=
viAokTUni97BrgYcuTNAAIIULQoEADTilxxNmp0tW1AACH5BAkAAJAALAAAAAAQABAAAAh+ACEJ=
HEiwoEGBjRodFOhogCOBAABAYqHgBRKCBAQEKLiizyM8BB1tLCiFSpEpCwu2EFEgZUEHGA6AgNR=
I4sIKjx5RoGnzIImcG1wKvLAAggWhMHKsCDmS4BM2j7qIGJixqUADOR8dGNjwIaSIkLIQeXRGws=
KEAgcdceFVKMGAACH5BAkAAJAALAAAAAAQABAAAAh9ACEJHEiwoEGBjRodFOhogCOBAAAwdEiQg=
IAABgMIIEDQEcaDAR4uHElSIIIOEx5AaiRxYYpHjzisbHkwAswEJSEVOBFiRMkoL3B0/Ehwhp5A=
iIQKtIjRAwMTDdRUgdlkYMOHBmBmuILGRqJFB1XA1ADpihM4CxV8QFHCYEAAIfkECQAAkAAsAAA=
AABAAEAAACHsAIQkcSLCgQYGNGh0U6GiAI4EAADB0SJCAgAAGAwggQNARxoMBHi4cSfJgI4kjAS=
iEdJKkypILE+RYYdDODiEDYQx5ZEAAwTA8YtAYeOORUSgOMBwAMcHNozoDBdR4tEVCBaMUWsTRo=
WDgA0ZHJEAiYXQDzAsLIFgwGBAAIfkECQAAkAAsAAAAABAAEAAACH0AIQkcSLCgQYGNGh0U6GiA=
I4EAADB0SJCAgAAGAwggQNARxoMBHi4c6YGBiQYjBxp49CjDSAAKVbDU8FKhgg8oSqQkOOMFkp2=
QuPyQ8SVJRpGQILCU4QdBhwkPIGnkKDCJHBsVtKRgyQFSQ6SQ2jiRAikCywRAC5wIMcJgQAAh+Q=
QFAACQACwAAAAAEAAQAAAIfAAhCRxIsKBABGSWUHEEqVEjgwKbAHpERAAkAAAEOhrAUOCNRyCLF=
AwggMBAAX+AMHBhMEBHgSKsMIFI0AGGAyBoEqwAkoJOAA9JgNzw8+GFBRAs6Cw4wAWCpQMbGZkh=
pOVLSDEe+ZhJkKTJgVN08GBxMSOkjVcLOoTKNiAAOw=3D=3D") no-repeat scroll 0px 0px=
;}
..F0XO1GC-b-A {padding-left: 8px;}
..gux-combo-item .F0XO1GC-b-A {padding-left: 21px;}
..F0XO1GC-b-z {height: 21px; width: 21px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAY=
AAACpF6WWAAAAoUlEQVR4XmNgGAWDFUgCMTu6ICXAHIgnAbEzugS5wB6IlwBxFLoEuSAQiGcCcR=
kQM6HJkQxYgTidAWJgDpocWYAbiCsZIAaWMkAsIAlMAWJ/IGaB8sWAuJkBYmAdEHNCxUkCjgwQA=
6qA2AKI+6B8kMG8SOpIBqkMEINguBOIhVBUkAFAXmxigBjYA8TSqNLkA1kGiIEKaOIUA7IiZRQM=
cgAAWowSHyS3HFUAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px; position: re=
lative; display: inline-block; top: 5px; left: 3px;}
..gux-combo-item .F0XO1GC-b-z {top: -4px; left: -8px; vertical-align: bottom=
; height: 15px;}
..F0XO1GC-b-B {overflow-y: hidden !important;}
..F0XO1GC-b-B:hover {overflow-y: auto;}
input.F0XO1GC-b-hb {border: 1px solid rgb(221, 75, 57) !important; color: r=
gb(221, 75, 57) !important;}
..F0XO1GC-b-Q ,.F0XO1GC-b-Q strong {color: rgb(221, 75, 57);}
..F0XO1GC-b-f {cursor: pointer;}
..F0XO1GC-b-f img {opacity: 0.667; margin: 12px 6px 11px;}
..F0XO1GC-b-f:hover img {opacity: 1;}
..F0XO1GC-b-i .popupContent {margin: 12px;}
..F0XO1GC-b-i label {display: block; margin-bottom: 4px; color: rgb(102, 102=
, 102);}
..F0XO1GC-b-i input[type=3D"text"] {height: 24px; line-height: 24px; width: =
99%;}
..F0XO1GC-b-g {position: absolute; right: 14px; bottom: 18px;}
..F0XO1GC-b-h {margin-bottom: 8px;}
..datePicker {padding: 16px; outline: 1px solid rgba(0, 0, 0, 0.2); opacity:=
0; width: 144px; position: absolute; left: -9999px; top: 6px; z-index: 3; =
background: rgb(255, 255, 255) none repeat scroll 0% 0%; box-shadow: 0px 2p=
x 4px rgba(0, 0, 0, 0.2); border-radius: 2px; transition: all 0.13s linear =
0s;}
..dateBoxPopup {background-color: white; z-index: 1023;}
..gwt-DatePicker {border: 1px solid rgb(162, 187, 221); cursor: default;}
..gwt-DatePicker td ,.datePickerMonthSelector td:focus {outline: medium none=
;}
..datePickerDays {width: 100%; background: white none repeat scroll 0% 0%;}
..datePickerWeekendLabel ,.datePickerWeekdayLabel {min-width: 20px; width: 2=
0px; height: 20px; line-height: 20px; padding-left: 3px; padding-right: 3px=
; font-size: 11px; text-align: center; color: rgb(102, 102, 102); cursor: d=
efault;}
..datePickerDay {min-width: 20px; width: 20px; height: 20px; line-height: 20=
px; padding-left: 3px; padding-right: 3px; font-size: 11px; text-align: cen=
ter; color: rgb(102, 102, 102); cursor: pointer;}
..datePickerDayIsToday {border: 1px solid black;}
..datePickerDayIsFiller {color: rgb(204, 204, 204);}
..datePickerDayIsValue {background: rgb(170, 204, 238) none repeat scroll 0%=
0%;}
..datePickerDayIsDisabled {color: rgb(170, 170, 170); font-style: italic;}
..datePickerDayIsHighlighted ,.datePickerPreviousButton-up-hovering ,.datePi=
ckerNextButton-up-hovering {background: rgb(238, 238, 238) none repeat scro=
ll 0% 0%; color: rgb(51, 51, 51);}
..datePickerDayIsValueAndHighlighted {background: rgb(187, 221, 217) none re=
peat scroll 0% 0%;}
..datePickerMonthSelector {width: 100%;}
td.datePickerMonth {text-align: center; white-space: nowrap; font-size: 13p=
x; color: rgb(102, 102, 102); padding-left: 4px;}
..datePickerPreviousButton ,.datePickerNextButton {font-size: 120%; line-hei=
ght: 1em; cursor: pointer; padding: 0px 4px;}
..F0XO1GC-b-pb { }
..F0XO1GC-b-rb {position: absolute; left: -10000px; top: auto; width: 1px; h=
eight: 1px; overflow: hidden;}
..iph-dialog {z-index: 1010 !important;}
..F0XO1GC-b-H {background-color: rgb(255, 255, 255);}
..F0XO1GC-b-Vb {z-index: 1999;}
..F0XO1GC-b-Vb > div {background-color: rgb(125, 164, 253) !important; borde=
r: 1px solid rgb(125, 164, 253) !important;}
..F0XO1GC-b-bb {height: 16px; width: 16px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCA=
IAAACQkWg2AAAAqklEQVQoz2P4TyJgoIKGCZu2IyN8GiAqfqICNG0MyKohKp5+Q0FAcPXlW7ged=
A1AFXuuPU2YsB2Cbr37AhQ5+fAxuga4aiACqlt+/BaQUb/8GJANETx46w5ED0LDvbfvkV0CNBtZ=
w6azF9E13HjxElk1xElwESwaTtx/BJdGU41dw56rN9HCB58GqKvevMNqA1w1ugagBBBhmo1dAzy=
mISrgCGdMk5OWiAEA3zqvClm2uDoAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;=
display: inline-block; position: relative; top: 3px; left: 3px;}
..F0XO1GC-b-db {background-color: rgba(255, 255, 255, 0); outline-style: non=
e; box-shadow: 0px 0px rgba(255, 255, 255, 0);}
..F0XO1GC-b-cb {overflow: hidden; padding: 10px; background-color: rgb(249, =
237, 190); border: 1px solid rgb(240, 195, 109); border-radius: 10px;}
..F0XO1GC-b-vb {margin-right: 15px;}
..F0XO1GC-b-Ub {font-weight: bold; color: rgb(119, 119, 119); margin: 10px;}
..F0XO1GC-b-ub {font-style: italic;}
..F0XO1GC-d-C {cursor: pointer; font-size: 13px; display: block;}
..F0XO1GC-d-x {position: relative; margin: 0px;}
..F0XO1GC-d-y {padding: 16px 0px 16px 28px;}
..F0XO1GC-b-N .F0XO1GC-d-y {padding: 16px 0px 16px 12px;}
..F0XO1GC-b-O .F0XO1GC-d-y ,body .F0XO1GC-d-y {padding: 7px 0px;}
..F0XO1GC-b-dc .F0XO1GC-d-y ,body .F0XO1GC-d-y {padding-left: 14px;}
..F0XO1GC-d-w {font-size: 13px; padding: 0px; margin: 0px; position: relativ=
e;}
..F0XO1GC-d-b {padding-bottom: 5px;}
..F0XO1GC-d-w div a {display: block; overflow: hidden; white-space: nowrap; =
text-decoration: none; color: rgb(51, 51, 51); cursor: pointer; font-size: =
13px; line-height: 30px; padding-left: 16px;}
..F0XO1GC-d-C a ,.F0XO1GC-d-C a:visited {display: block; overflow: hidden; p=
osition: relative; white-space: nowrap; text-decoration: none; color: rgb(5=
1, 51, 51); cursor: pointer; font-size: 13px; line-height: 30px; padding-le=
ft: 16px;}
..F0XO1GC-b-N .F0XO1GC-d-w div a ,.F0XO1GC-b-N .F0XO1GC-d-C a {line-height: =
24px;}
..F0XO1GC-b-O .F0XO1GC-d-w div a ,.F0XO1GC-b-O .F0XO1GC-d-C a ,body .F0XO1GC=
-d-w div a ,body .F0XO1GC-d-C a {line-height: 20px;}
..F0XO1GC-d-B ,.F0XO1GC-d-B .F0XO1GC-d-B {margin-left: 12px;}
..F0XO1GC-d-B .F0XO1GC-d-m a {padding-left: 4px;}
..F0XO1GC-d-w div a {position: relative;}
..F0XO1GC-d-d {position: absolute; top: 5px; bottom: 5px; left: 0px; right: =
0px;}
..F0XO1GC-d-w div.F0XO1GC-d-m a:hover ,.F0XO1GC-d-w div.F0XO1GC-d-c a:hover =
{color: rgb(34, 34, 34); background-color: rgb(238, 238, 238);}
..F0XO1GC-b-Db > div > a span ,.F0XO1GC-b-Db > a span ,body > div > a span ,=
body > a span {color: rgb(209, 72, 54);}
..F0XO1GC-b-Z {background-color: rgb(238, 238, 238);}
..F0XO1GC-d-w div.F0XO1GC-d-c {cursor: default;}
..F0XO1GC-b-C .F0XO1GC-d-B {display: none;}
..F0XO1GC-d-p {display: block; overflow: hidden; text-overflow: ellipsis; pa=
dding-left: 12px;}
..F0XO1GC-d-p > h3 {display: inline;}
..F0XO1GC-d-p > * {font-size: 13px;}
..F0XO1GC-d-c > a .F0XO1GC-d-p {cursor: default;}
..F0XO1GC-d-w div.F0XO1GC-d-t > a .F0XO1GC-d-p {padding-left: 0px;}
..F0XO1GC-d-B div.F0XO1GC-d-t > a .F0XO1GC-d-p {padding-left: 4px;}
..F0XO1GC-d-g {vertical-align: middle; line-height: 1px; cursor: default;}
..F0XO1GC-d-g span {cursor: default;}
..F0XO1GC-d-D {display: inline-block; width: 17px; height: 20px; position: a=
bsolute; top: 4px; left: 0px; margin-left: -1px; z-index: 10; cursor: point=
er; text-align: center;}
..F0XO1GC-d-D:hover {background-color: rgb(238, 238, 238);}
..F0XO1GC-b-N .F0XO1GC-d-D {top: 2px;}
..F0XO1GC-b-O .F0XO1GC-d-D ,body .F0XO1GC-d-D {top: 0px;}
..F0XO1GC-d-e {height: 16px; width: 16px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAY=
AAAAf8/9hAAAALElEQVR4XmNgoBQoKin+x4HfKygoGKCrxwBYNJJmCBZNJOFRA0YNGC4GUAoAAJ=
wgHbDiRLwAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;}
..F0XO1GC-b-Db .F0XO1GC-d-e ,body .F0XO1GC-d-e {height: 16px; width: 16px; o=
verflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,iV=
BORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAALUlEQVR4XmNgoBTc97b4jx2bv7/vZ=
WWArh4DYGok0RBMTaThUQNGDRguBlAKAIrl74P/KoO/AAAAAElFTkSuQmCC") no-repeat scr=
oll 0px 0px;}
..F0XO1GC-d-t .F0XO1GC-d-e {display: none;}
..F0XO1GC-d-t > div > a .F0XO1GC-d-p {padding-left: 0px;}
..F0XO1GC-d-z {height: 15px; width: 15px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA8AAAAPCAY=
AAAA71pVKAAAAtklEQVR4Xq1RURXDIAxEwiQkdEImoRImZRImYRIqYRIqAQk4oBxLHjSvlI/u3s=
srJNzlmjh3ACK62dwpvPcv9hxzJImI3FAoP1yVwMyfEp6D5NaugHRMPPG3fYSziCR8G0qFWI09d=
XVg8wWnyq46ozs9bO0yGbbDyPZhPSu/e92HAytTrasKsClWdVUgLzTRbLkFu7W08dv5ovcs8LTc=
HTCYEvKP6NgKDgUsQPirgK0PoQLYEO4bRktk6roSAYoAAAAASUVORK5CYII=3D") no-repeat =
scroll 0px 0px;}
..F0XO1GC-b-Db .F0XO1GC-d-z ,body .F0XO1GC-d-z {height: 15px; width: 15px; o=
verflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,iV=
BORw0KGgoAAAANSUhEUgAAAA8AAAAPCAYAAAA71pVKAAAAuElEQVR4Xq1RwQ2DMAzMCIzj/HgHK=
jFCR2GEjpARGKEjsIEzQjagsetAsAh5tCedROzc+YiNuQBOfadrt8ARZhwgJm7CyLWWUbq47oIB=
vDBIba0ayMQNHbzLS/QtJmTgC8kBmRZr7jmBrjNunU2RbIRe934WU+zQin3ZR2dftelUq/UY8qp=
5VYFjfqPmVSXaBR920lqGWktJz8J8dvDU2hPoYZjyjzTxZNgy0CDBXw10v4ndIG2Izh+5ScL343=
KOmQAAAABJRU5ErkJggg=3D=3D") no-repeat scroll 0px 0px;}
..F0XO1GC-d-i {position: absolute; top: 7px; opacity: 0.7; left: 4px;}
..F0XO1GC-b-N .F0XO1GC-d-i {top: 4px;}
..F0XO1GC-b-O .F0XO1GC-d-i ,body .F0XO1GC-d-i {top: 2px;}
..F0XO1GC-d-w div.F0XO1GC-d-m a:hover .F0XO1GC-d-i ,.F0XO1GC-d-f:hover .F0XO=
1GC-d-i ,.F0XO1GC-b-Db .F0XO1GC-d-i ,body .F0XO1GC-d-i {opacity: 1;}
..F0XO1GC-d-f .F0XO1GC-d-i {left: 16px;}
..F0XO1GC-d-m ,.F0XO1GC-d-c {position: relative;}
..F0XO1GC-d-q {padding-right: 20px;}
..F0XO1GC-d-n {display: block; float: right; position: relative; top: 7px; m=
argin-left: 3px; font-size: 11px; color: rgb(102, 102, 102) !important; bac=
kground-color: rgb(238, 238, 238); padding: 2px 3px; line-height: 12px; fon=
t-weight: normal;}
..F0XO1GC-b-N .F0XO1GC-d-n {top: 5px;}
..F0XO1GC-b-O .F0XO1GC-d-n ,body .F0XO1GC-d-n {top: 2px;}
..F0XO1GC-d-m a:hover .F0XO1GC-d-n ,.F0XO1GC-d-c a:hover .F0XO1GC-d-n {backg=
round-color: rgb(204, 204, 204); color: rgb(51, 51, 51) !important;}
..F0XO1GC-d-j {display: none;}
..F0XO1GC-d-m:hover .F0XO1GC-d-j ,.F0XO1GC-d-f:hover .F0XO1GC-d-j ,.F0XO1GC-=
d-a {display: inline;}
..F0XO1GC-d-m .F0XO1GC-d-v ,.F0XO1GC-d-c .F0XO1GC-d-v {top: 8px; right: 3px;=
z-index: 2; position: absolute; height: 13px; width: 13px; overflow: hidde=
n;}
..F0XO1GC-b-N .F0XO1GC-d-m .F0XO1GC-d-v ,.F0XO1GC-b-N .F0XO1GC-d-c .F0XO1GC-=
d-v {top: 6px;}
..F0XO1GC-b-O .F0XO1GC-d-m .F0XO1GC-d-v ,.F0XO1GC-b-O .F0XO1GC-d-c .F0XO1GC-=
d-v ,body .F0XO1GC-d-m .F0XO1GC-d-v ,body .F0XO1GC-d-c .F0XO1GC-d-v {top: 4=
px;}
..F0XO1GC-d-v input {border: 0px none; padding: 0px; outline: medium none;}
a.F0XO1GC-d-u {height: 13px; width: 13px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCA=
YAAABy6+R8AAAARUlEQVR4XmN49+7d/6dPnxKNQeoZQAxSAEj9UNJ05swZnBinJhBAV4ysAQSwa=
gIBXBpAAKcmEMCmAQTwasIF6KyJnLQHABO3ibexFooiAAAAAElFTkSuQmCC") no-repeat scr=
oll 0px 0px;}
a.F0XO1GC-d-u:hover ,.F0XO1GC-d-a a.F0XO1GC-d-u {height: 13px; width: 13px;=
overflow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,=
iVBORw0KGgoAAAANSUhEUgAAAA0AAAANCAYAAABy6+R8AAAAQUlEQVR4XmO4fv36/2PHjhGNQeo=
ZQIx3794RjUHqh5KmyMhInBinJlwa8dqETSO6HE5NMI3oYgQ14cJ01kRO2gMAVulOLFDgg5kAAA=
AASUVORK5CYII=3D") no-repeat scroll 0px 0px;}
a.F0XO1GC-d-u {display: inline-block; padding: 0px !important;}
..F0XO1GC-d-E {font-weight: bold;}
..F0XO1GC-d-r {padding: 4px 8px;}
..F0XO1GC-d-r div {background-color: rgb(249, 237, 190); border: 2px solid r=
gb(249, 237, 190); color: rgb(34, 34, 34); padding: 4px; line-height: 16px;=
border-radius: 6px; text-align: center;}
div.dragdrop-dropTarget-engage .F0XO1GC-d-g {border: 1px solid red;}
..dragdrop-flow-panel-positioner {display: block; height: 2px; background-co=
lor: rgb(34, 34, 34); vertical-align: baseline !important;}
..F0XO1GC-d-f {position: relative; outline-style: none;}
..dragdrop-dropTarget-engage > .F0XO1GC-d-f a {background-color: rgb(136, 13=
6, 136);}
..F0XO1GC-d-s div.dragdrop-dropTarget-engage {border: 2px solid rgb(34, 34, =
34);}
..F0XO1GC-d-l {outline-style: none; margin-bottom: 9px;}
..F0XO1GC-d-h {font-size: 11px; color: rgb(68, 68, 68); text-align: center; =
padding: 16px 0px 20px 16px;}
..F0XO1GC-d-h a {white-space: nowrap;}
..F0XO1GC-d-h a:visited {color: rgb(17, 85, 204);}
..F0XO1GC-d-F {background-color: rgb(250, 250, 210) !important;}
..F0XO1GC-d-k {border-top: 1px solid rgb(235, 235, 235); margin-top: 4px; ma=
rgin-bottom: 10px;}
..F0XO1GC-c-d {color: rgb(184, 184, 184);}
..F0XO1GC-c-a {color: rgb(17, 85, 204); text-decoration: none; cursor: point=
er; white-space: nowrap;}
..F0XO1GC-c-b ,.F0XO1GC-c-b:visited ,.F0XO1GC-c-b:focus {color: rgb(184, 184=
, 184); text-decoration: none; cursor: text; outline: medium none;}
..F0XO1GC-A-a {position: relative; top: 3px; height: 15px; width: 15px;}
..F0XO1GC-w-a {width: 100%; margin-right: 0px; height: 8px; position: absolu=
te; top: 0px; left: 0px; opacity: 0; border-top: 1px solid rgb(235, 235, 23=
5);}
..F0XO1GC-m-c {text-align: left; border-bottom: 1px solid rgb(153, 153, 153)=
; font-size: 150%; padding-bottom: 4px;}
..F0XO1GC-m-g .F0XO1GC-m-d {width: 100%;}
..F0XO1GC-m-d th {text-align: left; padding-top: 16px;}
..F0XO1GC-m-d .F0XO1GC-m-a {vertical-align: top;}
..F0XO1GC-m-d .F0XO1GC-m-e {text-align: right; font-weight: bold; white-spac=
e: nowrap; padding-right: 0.3em;}
..F0XO1GC-m-d .F0XO1GC-m-b {font-size: 70%;}
..F0XO1GC-m-d .F0XO1GC-m-f {text-align: left;}
..F0XO1GC-m-g .F0XO1GC-m-a {width: 50%;}
..F0XO1GC-m-g .F0XO1GC-m-e ,.F0XO1GC-m-g th {color: rgb(221, 221, 0);}
..F0XO1GC-m-g .F0XO1GC-m-b ,.F0XO1GC-m-g td {color: rgb(255, 255, 255);}
..F0XO1GC-m-g th {font-weight: bold; padding: 16px 4px 4px;}
..F0XO1GC-m-g td {padding: 4px;}
..F0XO1GC-n-a {cursor: pointer; font-size: 11px; font-weight: bold; text-ali=
gn: center; margin-right: 16px; white-space: nowrap; height: 27px; line-hei=
ght: 27px; min-width: 54px; outline: 0px none; padding: 0px 8px; border-rad=
ius: 2px; display: inline-block;}
..F0XO1GC-c-c .F0XO1GC-n-a {min-width: 26px !important; margin-right: 10px;}
..chrome-theme .F0XO1GC-n-a {border-radius: 3px; font-size: 12px; font-weigh=
t: 700; padding: 0px 17px; text-align: center; text-decoration: none !impor=
tant;}
..F0XO1GC-n-a:hover {border: 1px solid rgb(198, 198, 198); box-shadow: 0px 1=
px 1px rgba(0, 0, 0, 0.1);}
..chrome-theme .F0XO1GC-n-a:hover {box-shadow: none;}
..F0XO1GC-n-j {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..F0XO1GC-n-a img.F0XO1GC-n-d {vertical-align: middle; margin-top: -2px; opa=
city: 0.667;}
..F0XO1GC-n-j img.F0XO1GC-n-d ,.F0XO1GC-n-c img.F0XO1GC-n-d ,.F0XO1GC-n-a:ho=
ver img.F0XO1GC-n-d {opacity: 1;}
..F0XO1GC-n-h {min-width: 34px; padding: 0px 4px;}
..F0XO1GC-n-b {cursor: default; opacity: 0.5; pointer-events: none;}
..F0XO1GC-n-f {border-right-color: transparent; margin-right: 0px;}
..F0XO1GC-n-g {border-radius: 0px; margin-left: -1px; margin-right: -1px;}
..F0XO1GC-n-i {border-left-color: transparent; margin-left: 0px;}
..F0XO1GC-n-f {border-radius: 2px 0px 0px 2px;}
..F0XO1GC-n-f { }
..F0XO1GC-n-f {border-radius: 2px 0px 0px 2px;}
..F0XO1GC-n-i {border-radius: 0px 2px 2px 0px;}
..F0XO1GC-n-i { }
..F0XO1GC-n-i {border-radius: 0px 2px 2px 0px;}
..F0XO1GC-n-i {margin-left: -1px;}
..chrome-theme .F0XO1GC-n-f {border-radius: 3px 0px 0px 3px;}
..chrome-theme .F0XO1GC-n-f { }
..chrome-theme .F0XO1GC-n-f {border-radius: 3px 0px 0px 3px;}
..chrome-theme .F0XO1GC-n-i {border-radius: 0px 3px 3px 0px;}
..chrome-theme .F0XO1GC-n-i { }
..chrome-theme .F0XO1GC-n-i {border-radius: 0px 3px 3px 0px;}
..chrome-theme .F0XO1GC-n-i {margin-left: -1px;}
..jfk-button-standard {color: rgb(102, 102, 102); border: 1px solid rgba(0, =
0, 0, 0.1); background-color: rgb(245, 245, 245); background-image: -moz-li=
near-gradient(center top , rgb(245, 245, 245), rgb(241, 241, 241));}
..jfk-button-standard:hover {border: 1px solid rgb(198, 198, 198); color: rg=
b(51, 51, 51); background-color: rgb(248, 248, 248); background-image: -moz=
-linear-gradient(center top , rgb(248, 248, 248), rgb(241, 241, 241));}
..jfk-button-standard:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) ins=
et;}
..jfk-button-standard:focus {outline: medium none; border: 1px solid rgb(77,=
144, 254); z-index: 4;}
..chrome-theme .jfk-button-standard:focus {border: 1px solid rgb(170, 170, 1=
70);}
..jfk-button-standard.F0XO1GC-n-j {background-color: rgb(238, 238, 238); bor=
der: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51); background-image=
: -moz-linear-gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224))=
;}
..jfk-button-standard.F0XO1GC-n-b {background: rgb(255, 255, 255) none repea=
t scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(184, 184,=
184);}
..F0XO1GC-k-b {height: 4px; width: 7px; overflow: hidden; background: rgba(0=
, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAECAYAA=
ABCxiV9AAAAHElEQVR4XmOIjIz8jwszgAC6IFwCBnBKwAC6BACk/yChPTGdaAAAAABJRU5ErkJg=
gg=3D=3D") no-repeat scroll 0px 0px; display: inline-block; margin-left: 7p=
x; margin-bottom: 1px; opacity: 0.8;}
..F0XO1GC-k-c:hover .F0XO1GC-k-b {opacity: 1;}
..F0XO1GC-f-F ,.F0XO1GC-f-x {position: relative;}
..F0XO1GC-f-q {height: 68px; background-color: rgb(245, 245, 245); padding: =
0px 44px; vertical-align: middle; border-top: 1px solid rgb(229, 229, 229);=
border-bottom: 1px solid rgb(229, 229, 229); position: relative;}
..F0XO1GC-b-N .F0XO1GC-f-q {padding: 0px 28px;}
..F0XO1GC-b-O .F0XO1GC-f-q ,body .F0XO1GC-f-q {height: 44px; padding: 0px 16=
px;}
..F0XO1GC-b-dc .F0XO1GC-f-q ,body .F0XO1GC-f-q {padding-right: 30px; padding=
-left: 30px;}
..F0XO1GC-f-p {position: absolute; left: 44px;}
..F0XO1GC-b-N .F0XO1GC-f-p {left: 28px;}
..F0XO1GC-b-O .F0XO1GC-f-p ,body .F0XO1GC-f-p {left: 16px; height: 60px; top=
: -7px;}
..F0XO1GC-b-dc .F0XO1GC-f-p ,body .F0XO1GC-f-p {left: 30px;}
..F0XO1GC-f-D {height: 68px; position: absolute; left: 220px; right: 0px;}
..F0XO1GC-b-N .F0XO1GC-f-D {left: 204px;}
..F0XO1GC-b-O .F0XO1GC-f-D ,body .F0XO1GC-f-D {left: 176px; height: 44px;}
..F0XO1GC-b-dc .F0XO1GC-f-D ,body .F0XO1GC-f-D {left: 204px;}
..F0XO1GC-f-E {padding: 12px 8px;}
..F0XO1GC-f-G ,.F0XO1GC-f-G > * ,body > * {outline: medium none !important;}
..F0XO1GC-f-v {width: 198px; position: absolute; left: 0px;}
..F0XO1GC-f-l {margin-left: 220px;}
..F0XO1GC-f-l:focus {outline: medium none;}
..F0XO1GC-f-f {position: absolute; top: 7px; left: 244px; cursor: pointer; z=
-index: 2;}
..F0XO1GC-f-j .F0XO1GC-f-v {display: none;}
..F0XO1GC-f-j .F0XO1GC-f-e {margin-left: 24px !important;}
..F0XO1GC-f-j .F0XO1GC-f-d {margin-left: 220px !important;}
..F0XO1GC-f-j .F0XO1GC-f-f {left: 0px;}
..F0XO1GC-f-o .F0XO1GC-f-q ,.F0XO1GC-f-o .F0XO1GC-f-v ,.F0XO1GC-f-o .F0XO1GC=
-b-p {display: none;}
..F0XO1GC-f-o .F0XO1GC-f-l {margin-left: 24px !important;}
..F0XO1GC-f-o .F0XO1GC-b-o ,.F0XO1GC-f-o .F0XO1GC-b-G {padding-right: 8px;}
..F0XO1GC-f-o .F0XO1GC-f-x {position: relative;}
..F0XO1GC-f-o .F0XO1GC-f-x .F0XO1GC-f-l {margin-left: 0px !important; positi=
on: absolute; top: 0px; bottom: 0px; right: 0px; left: 24px !important;}
..F0XO1GC-f-o .F0XO1GC-b-D {position: relative;}
..F0XO1GC-f-o .F0XO1GC-f-n {display: none !important;}
#gb.F0XO1GC-f-o ,#gba.F0XO1GC-f-o {display: none;}
..F0XO1GC-f-y {padding: 5px;}
..F0XO1GC-f-z {outline: medium none; border: medium none;}
..F0XO1GC-f-z img {outline: medium none; border: medium none; margin-top: 8p=
x;}
..F0XO1GC-f-A {position: absolute; width: 8px; top: 0px; bottom: 0px; right:=
-20px; cursor: col-resize;}
..F0XO1GC-f-A .F0XO1GC-f-C {display: block; position: absolute; left: 5px; t=
op: 0px; bottom: 0px; border-left: 1px solid rgb(235, 235, 235);}
..F0XO1GC-f-B .F0XO1GC-f-C {border-left: 1px solid rgb(235, 235, 235);}
..F0XO1GC-f-A .F0XO1GC-f-i {visibility: visible !important;}
..F0XO1GC-b-w {top: -15px;}
..F0XO1GC-f-q .F0XO1GC-b-w {top: 54px;}
html ,body ,#gb ,#gbx1 {min-width: 700px;}
html {overflow-x: auto; overflow-y: hidden;}
body {overflow: visible;}
..F0XO1GC-f-b {overflow: hidden; min-height: 30px;}
..F0XO1GC-f-w {position: absolute; right: 0px; top: 0px; padding-left: 16px;=
}
..F0XO1GC-f-w > div > div {display: inline-block; margin-right: 0px; margin-=
left: 16px;}
..F0XO1GC-c-c .F0XO1GC-f-w > div > div {margin-left: 10px; margin-right: 0px=
;}
..F0XO1GC-f-w > div > div:first-child {margin-left: 0px;}
..F0XO1GC-f-g {transform: rotate(180deg); vertical-align: middle;}
..F0XO1GC-f-m {transform: rotate(0deg); vertical-align: middle;}
..F0XO1GC-f-h {border: 1px solid rgb(235, 235, 235); padding: 4px; cursor: p=
ointer !important;}
..F0XO1GC-b-O .F0XO1GC-f-h ,body .F0XO1GC-f-h {padding: 3px 3px 4px;}
..F0XO1GC-f-h:hover {background-color: rgb(238, 238, 238);}
..F0XO1GC-f-i:hover {visibility: visible;}
..F0XO1GC-f-i {visibility: hidden; position: absolute; right: 2px; top: 0px;=
bottom: 0px; padding: 8px 0px 8px 8px;}
..F0XO1GC-f-n {display: none; position: absolute; padding: 8px 0px;}
..F0XO1GC-f-j .F0XO1GC-f-n {display: block;}
..F0XO1GC-b-N .F0XO1GC-f-i {padding: 7px 0px 7px 7px;}
..F0XO1GC-b-O .F0XO1GC-f-i ,body .F0XO1GC-f-i {padding: 6px 0px 6px 6px;}
..F0XO1GC-b-N .F0XO1GC-f-n {padding: 7px 0px;}
..F0XO1GC-b-O .F0XO1GC-f-n ,body .F0XO1GC-f-n {padding: 6px 0px;}
..F0XO1GC-r-d {padding-right: 144px; white-space: nowrap;}
..F0XO1GC-r-e {margin: 19px 16px 0px 0px; white-space: nowrap; min-width: 38=
4px; max-width: 512px; width: 100%; display: inline-block; position: relati=
ve; height: 29px; line-height: 27px; vertical-align: top;}
..F0XO1GC-b-O .F0XO1GC-r-e ,body .F0XO1GC-r-e {margin-top: 7px;}
..F0XO1GC-r-e input[type=3D"text"] {position: absolute; left: 0px; right: 0p=
x; width: 100%;}
..F0XO1GC-r-b {max-height: 250px; overflow-y: auto; overflow-x: hidden; whit=
e-space: nowrap;}
..F0XO1GC-r-b .F0XO1GC-r-c {padding-left: 20px;}
..suggestPopupContent {cursor: pointer;}
..suggestPopupContent .F0XO1GC-r-g {margin-left: 5px; color: rgb(0, 0, 0);}
..F0XO1GC-r-i {position: relative;}
..F0XO1GC-r-h {position: relative; float: left; margin: 8px 6px 0px 0px;}
..F0XO1GC-r-f {margin-top: 19px; vertical-align: top;}
..F0XO1GC-b-O .F0XO1GC-r-f ,body .F0XO1GC-r-f {margin-top: 7px;}
..F0XO1GC-r-f img {opacity: 1 !important;}
..F0XO1GC-r-a {cursor: pointer; position: absolute; right: 2px; text-align: =
center;}
..F0XO1GC-r-a img {opacity: 0.667; margin: 0px 6px 2px;}
..F0XO1GC-r-a:hover img {opacity: 1;}
..F0XO1GC-j-t {background-color: white; border: medium none; outline: medium=
none; padding: 0px;}
..F0XO1GC-j-m {font-size: 16px; line-height: 24px; color: rgb(34, 34, 34); f=
ont-weight: normal; margin-bottom: 8px;}
..F0XO1GC-b-wb .F0XO1GC-j-m ,.F0XO1GC-j-t .F0XO1GC-j-m ,.F0XO1GC-b-O .F0XO1G=
C-b-wb .F0XO1GC-j-m ,.F0XO1GC-b-N .F0XO1GC-b-wb .F0XO1GC-j-m ,.F0XO1GC-b-M =
..F0XO1GC-b-wb .F0XO1GC-j-m ,body .F0XO1GC-b-wb .F0XO1GC-j-m {background-col=
or: rgb(66, 133, 244); color: rgb(255, 255, 255); height: 36px; padding: 0p=
x; margin: 0px;}
..F0XO1GC-b-O .F0XO1GC-j-m ,body .F0XO1GC-j-m {padding: 20px 16px 0px;}
..F0XO1GC-j-e {overflow-y: auto; overflow-x: hidden; position: relative; max=
-width: 600px; min-width: 250px; font-size: 13px; line-height: 17px;}
..F0XO1GC-b-O .F0XO1GC-b-wb .F0XO1GC-j-f ,.F0XO1GC-b-N .F0XO1GC-b-wb .F0XO1G=
C-j-f ,.F0XO1GC-b-M .F0XO1GC-b-wb .F0XO1GC-j-f ,.F0XO1GC-b-wb .F0XO1GC-j-f =
,body .F0XO1GC-b-wb .F0XO1GC-j-f {margin: 0px;}
..F0XO1GC-j-f {margin: 24px;}
..F0XO1GC-b-O .F0XO1GC-j-f ,body .F0XO1GC-j-f {margin: 12px;}
..F0XO1GC-j-f .F0XO1GC-j-q {font-weight: bold;}
..F0XO1GC-j-f .F0XO1GC-j-n {color: rgb(102, 102, 102); margin-bottom: 12px; =
margin-left: 22px;}
..F0XO1GC-j-f .F0XO1GC-j-o {margin-top: 12px;}
..F0XO1GC-j-r {height: 24px; width: 24px;}
..F0XO1GC-j-j ,.F0XO1GC-j-h {display: table-cell;}
..F0XO1GC-j-i {margin: 24px;}
..F0XO1GC-j-g {margin-top: 24px; text-align: left;}
..F0XO1GC-j-h > .F0XO1GC-j-g {margin: 48px 24px 24px;}
..F0XO1GC-j-y.F0XO1GC-j-w .F0XO1GC-j-g {margin-top: 24px;}
..F0XO1GC-j-x .F0XO1GC-j-f {margin-top: 0px;}
..F0XO1GC-j-w .F0XO1GC-j-f {margin-bottom: 0px;}
..F0XO1GC-j-p .F0XO1GC-j-e {overflow: visible; max-width: none; padding: 0px=
;}
..F0XO1GC-j-u .F0XO1GC-j-c {display: none;}
..F0XO1GC-j-c {cursor: pointer; right: 10px; position: absolute; top: 6px;}
..F0XO1GC-b-wb .F0XO1GC-j-c ,.F0XO1GC-j-s .F0XO1GC-j-c {line-height: 36px; t=
op: 8px; vertical-align: text-bottom;}
..F0XO1GC-j-c img:hover {background-color: rgb(123, 170, 247);}
..F0XO1GC-j-s {background-color: rgb(66, 133, 244); bottom: 0px; height: 36p=
x; position: fixed; right: 25px; width: 260px; z-index: 1;}
..F0XO1GC-j-t .F0XO1GC-j-l ,.F0XO1GC-b-wb .F0XO1GC-j-l ,.F0XO1GC-j-s .F0XO1G=
C-j-l {color: rgb(255, 255, 255); font-family: "Roboto",Arial,sans-serif; f=
ont-size: 16px; font-weight: normal; line-height: 36px; padding-left: 15px;=
text-align: left;}
..F0XO1GC-b-i .F0XO1GC-j-c {top: 5px; right: 5px;}
..F0XO1GC-b-i .F0XO1GC-j-c img {display: block;}
..F0XO1GC-j-f .F0XO1GC-k-c ,.F0XO1GC-j-f .F0XO1GC-k-c:focus {background-imag=
e: none; background-repeat: repeat; background-attachment: scroll; backgrou=
nd-clip: border-box; background-origin: padding-box; background-position: 0=
% 0%; background-size: auto auto; background-color: inherit; border: 1px so=
lid rgba(0, 0, 0, 0); box-shadow: none; color: inherit; font-size: 13px; pa=
dding: 0px 3px; opacity: 0.6;}
..F0XO1GC-j-f .F0XO1GC-k-c:hover {background-color: lightgray;}
..F0XO1GC-v-a {height: 21px; width: 21px; overflow: hidden; background: rgba=
(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAY=
AAACpF6WWAAAAoUlEQVR4XmNgGAWDFUgCMTu6ICXAHIgnAbEzugS5wB6IlwBxFLoEuSAQiGcCcR=
kQM6HJkQxYgTidAWJgDpocWYAbiCsZIAaWMkAsIAlMAWJ/IGaB8sWAuJkBYmAdEHNCxUkCjgwQA=
6qA2AKI+6B8kMG8SOpIBqkMEINguBOIhVBUkAFAXmxigBjYA8TSqNLkA1kGiIEKaOIUA7IiZRQM=
cgAAWowSHyS3HFUAAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px; position: ab=
solute; left: 3px;}
..gux-combo-item.F0XO1GC-v-b {padding-left: 28px;}
..goog-button-base {cursor: default; font: 0.846em/1 Arial,sans-serif; lette=
r-spacing: normal; margin: 0px 1px; outline: medium none; text-align: cente=
r; text-indent: 0px; text-transform: none; vertical-align: baseline; white-=
space: nowrap; word-spacing: normal;}
..goog-button-base-outer-box {border-top: 1px solid rgb(187, 187, 187); bord=
er-bottom: 1px solid rgb(170, 170, 170);}
..goog-button-base-inner-box {background: rgb(227, 227, 227) none repeat scr=
oll 0% 0%; border-left: 1px solid rgb(187, 187, 187); border-right: 1px sol=
id rgb(170, 170, 170); margin: 0px -1px;}
..goog-button-base-pos {height: 100%; position: relative;}
..goog-button-base-top-shadow {background: rgb(249, 249, 249) none repeat sc=
roll 0% 0%; border-bottom: 0.23em solid rgb(238, 238, 238); height: 0.692em=
; left: 0px; overflow: hidden; position: absolute; right: 0px; top: 0px;}
..goog-button-base-content {color: rgb(51, 51, 51); line-height: 1.7em; posi=
tion: relative; padding: 0px 0.545em; text-align: center;}
..goog-button-base-hover .goog-button-base-content ,.goog-button-base-focuse=
d .goog-button-base-content {color: rgb(0, 0, 0);}
..goog-button-base-hover .goog-button-base-outer-box ,.goog-button-base-hove=
r .goog-button-base-inner-box ,.goog-button-base-focused .goog-button-base-=
outer-box ,.goog-button-base-focused .goog-button-base-inner-box {border-co=
lor: rgb(136, 136, 136);}
..goog-button-base-active .goog-button-base-inner-box ,.goog-button-base-ope=
n .goog-button-base-inner-box {background: rgb(249, 249, 249) none repeat s=
croll 0% 0%;}
..goog-button-base-active .goog-button-base-top-shadow ,.goog-button-base-op=
en .goog-button-base-top-shadow {background: rgb(227, 227, 227) none repeat=
scroll 0% 0%;}
..goog-button-base-active .goog-button-base-content ,.goog-button-base-open =
..goog-button-base-content {color: rgb(0, 0, 0);}
..goog-button-base-primary .goog-button-base-content {font-weight: bold; col=
or: rgb(0, 0, 0);}
..goog-button-base-disabled {cursor: default;}
..goog-button-base-disabled .goog-button-base-inner-box {background: rgb(238=
, 238, 238) none repeat scroll 0% 0%;}
..goog-button-base-disabled .goog-button-base-top-shadow {background: rgb(23=
8, 238, 238) none repeat scroll 0% 0%; border-color: rgb(238, 238, 238);}
..goog-button-base-disabled .goog-button-base-content {color: rgb(153, 153, =
153);}
..goog-button-base-collapse-right ,.goog-button-base-collapse-right .goog-bu=
tton-base-inner-box {margin-right: 0px;}
..goog-button-base-collapse-left {margin-left: 0px;}
..goog-button-base-collapse-left .goog-button-base-inner-box {margin-left: 0=
px; border-left: 1px solid rgb(255, 255, 255);}
..goog-button-base-hover.goog-button-base-collapse-left ,.goog-button-base-f=
ocused.goog-button-base-collapse-left {border-left: 1px solid rgb(136, 136,=
136); margin-left: -1px; z-index: 1;}
..goog-button-base-selected .goog-button-base-outer-box ,.goog-button-base-s=
elected .goog-button-base-inner-box {background-color: rgb(119, 119, 119); =
border-color: rgb(136, 136, 136);}
..goog-button-base-selected .goog-button-base-top-shadow {border-bottom-colo=
r: rgb(136, 136, 136); background-color: rgb(153, 153, 153);}
..goog-button-base-selected .goog-button-base-content {color: rgb(238, 238, =
238);}
..goog-button-base-collapse-left.goog-button-base-selected .goog-button-base=
-inner-box {border-left: 1px solid rgb(85, 85, 85);}
..F0XO1GC-q-e {background-color: rgb(42, 42, 42); border: 1px solid rgb(255,=
255, 255); color: rgb(255, 255, 255); display: block; position: absolute; =
padding: 5px 7px; z-index: 10; white-space: nowrap;}
..F0XO1GC-q-g {z-index: 1021;}
..F0XO1GC-q-e strong {color: rgb(255, 255, 255);}
..F0XO1GC-q-e::before ,.F0XO1GC-q-e::after {border-style: solid; content: ""=
; display: block; height: 0px; position: absolute; width: 0px;}
..F0XO1GC-q-e.F0XO1GC-q-f::before ,.F0XO1GC-q-e.F0XO1GC-q-h::before ,.F0XO1G=
C-q-e.F0XO1GC-q-i::before ,.F0XO1GC-q-e.F0XO1GC-q-d::before {bottom: auto; =
margin-top: -7px; top: 50%;}
..F0XO1GC-q-e.F0XO1GC-q-f::after ,.F0XO1GC-q-e.F0XO1GC-q-h::after ,.F0XO1GC-=
q-e.F0XO1GC-q-i::after ,.F0XO1GC-q-e.F0XO1GC-q-d::after {bottom: auto; marg=
in-top: -6px; top: 50%;}
..F0XO1GC-q-e.F0XO1GC-q-l::before ,.F0XO1GC-q-e.F0XO1GC-q-c::before ,.F0XO1G=
C-q-e.F0XO1GC-q-l::after ,.F0XO1GC-q-e.F0XO1GC-q-c::after {left: 80% !impor=
tant;}
..F0XO1GC-q-e.F0XO1GC-q-k::before ,.F0XO1GC-q-e.F0XO1GC-q-b::before ,.F0XO1G=
C-q-e.F0XO1GC-q-k::after ,.F0XO1GC-q-e.F0XO1GC-q-b::after {left: 20% !impor=
tant;}
..F0XO1GC-q-e.F0XO1GC-q-j::before ,.F0XO1GC-q-e.F0XO1GC-q-a::before {left: 5=
0%; margin-left: -7px; right: auto;}
..F0XO1GC-q-e.F0XO1GC-q-j::after ,.F0XO1GC-q-e.F0XO1GC-q-a::after {left: 50%=
; margin-left: -6px; right: auto;}
..F0XO1GC-q-e.F0XO1GC-q-j::before {border-color: rgb(255, 255, 255) transpar=
ent; border-width: 8px 7px 0px; bottom: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-j::after {border-color: rgb(42, 42, 42) transparent;=
border-width: 7px 6px 0px; bottom: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-a::before {border-color: rgb(255, 255, 255) transpar=
ent; border-width: 0px 7px 8px; top: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-a::after {border-color: rgb(42, 42, 42) transparent;=
border-width: 0px 6px 7px; top: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-f::before {border-color: transparent rgb(255, 255, 2=
55); border-width: 7px 0px 7px 8px; right: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-f::after {border-color: transparent rgb(42, 42, 42);=
border-width: 6px 0px 6px 7px; right: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-h::before {border-color: transparent rgb(255, 255, 2=
55); border-width: 7px 8px 7px 0px; left: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-h::after {border-color: transparent rgb(42, 42, 42);=
border-width: 6px 7px 6px 0px; left: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-i::before {border-color: transparent rgb(255, 255, 2=
55); border-width: 7px 0px 7px 8px; right: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-i::after {border-color: transparent rgb(42, 42, 42);=
border-width: 6px 0px 6px 7px; right: -7px;}
..F0XO1GC-q-e.F0XO1GC-q-d::before {border-color: transparent rgb(255, 255, 2=
55); border-width: 7px 8px 7px 0px; left: -8px;}
..F0XO1GC-q-e.F0XO1GC-q-d::after {border-color: transparent rgb(42, 42, 42);=
border-width: 6px 7px 6px 0px; left: -7px;}
..F0XO1GC-nc-b {color: rgb(119, 119, 119); text-align: center; padding: 4px;=
}
..F0XO1GC-nc-a {color: rgb(5, 71, 192);}
..F0XO1GC-jb-c {display: inline; white-space: nowrap; padding: 0px 2px;}
..F0XO1GC-jb-a {color: rgb(238, 68, 68); font-size: 13px;}
..F0XO1GC-jb-b {font-size: 13px;}
..gux-confirm-panel-r1 {background-color: rgb(255, 238, 136); border-left: 1=
px solid rgb(255, 253, 240); border-right: 1px solid rgb(255, 253, 240); ma=
rgin: 0px 1px; padding-top: 1px;}
..gux-confirm-panel-r2 {background-color: rgb(255, 238, 136); border-left: 1=
px solid rgb(255, 253, 240); border-right: 1px solid rgb(255, 253, 240); pa=
dding-top: 1px;}
..gux-confirm-panel-c {background-color: rgb(255, 238, 136); padding: 2px 15=
px;}
..gux-confirm-panel-message {color: rgb(0, 0, 0); font-weight: bold;}
..F0XO1GC-mb-k {height: 5px; width: 100%; background-color: rgb(187, 204, 25=
5);}
..F0XO1GC-mb-q {overflow: hidden;}
..F0XO1GC-mb-J {padding: 5px; overflow: hidden;}
..F0XO1GC-mb-x {border-bottom: 1px solid rgb(235, 235, 235); padding-top: 8p=
x; padding-bottom: 8px;}
..F0XO1GC-mb-ab .F0XO1GC-mb-y ,body .F0XO1GC-mb-y {padding-right: 20px;}
..F0XO1GC-mb-z {float: right;}
..F0XO1GC-mb-Z {display: inline;}
..F0XO1GC-mb-u {white-space: nowrap; font-weight: normal; float: right; font=
-size: 13px; color: rgb(102, 102, 102);}
..F0XO1GC-mb-v ,.F0XO1GC-mb-v:hover ,.F0XO1GC-mb-v:visited {text-decoration:=
none; color: rgb(136, 136, 136); cursor: default;}
..chrome-theme .F0XO1GC-mb-u {display: none;}
..F0XO1GC-mb-M {margin-right: 16px;}
..F0XO1GC-mb-cb {font-weight: bold;}
..F0XO1GC-nb-W.F0XO1GC-mb-o {border-top: 1px solid rgb(221, 221, 221);}
..F0XO1GC-nb-W.F0XO1GC-mb-l {border-bottom: 1px solid rgb(221, 221, 221);}
..F0XO1GC-mb-N ,.F0XO1GC-mb-P {padding-bottom: 5px; min-width: 100%;}
..F0XO1GC-mb-K {padding: 5px;}
..F0XO1GC-mb-Y {font-size: 18px;}
..F0XO1GC-mb-bb {font-size: 18px; background-color: rgb(235, 238, 248);}
..F0XO1GC-mb-V {white-space: nowrap;}
..F0XO1GC-mb-ab .F0XO1GC-mb-V ,body .F0XO1GC-mb-V {display: inline-block; ve=
rtical-align: baseline; margin-top: 4px;}
..F0XO1GC-mb-n {color: rgb(34, 34, 34); font-weight: normal;}
..F0XO1GC-mb-fb {vertical-align: middle; margin-right: 1.5em;}
..F0XO1GC-mb-eb {color: black; text-decoration: none; cursor: default; font-=
weight: bold;}
..F0XO1GC-mb-gb {color: rgb(34, 0, 204); cursor: pointer; font-weight: bold;=
}
..F0XO1GC-mb-db {color: rgb(34, 0, 204); cursor: pointer; white-space: nowra=
p; display: inline-block; vertical-align: bottom;}
..F0XO1GC-mb-ab .F0XO1GC-mb-db ,body .F0XO1GC-mb-db {position: relative; top=
: 1px;}
..F0XO1GC-mb-db span {margin-right: 2px;}
..F0XO1GC-mb-db img {opacity: 0.667;}
..F0XO1GC-mb-db img:hover {opacity: 1;}
..F0XO1GC-mb-A ,.F0XO1GC-mb-E {position: relative;}
..F0XO1GC-mb-E > .F0XO1GC-nb-W {margin-top: 20px;}
..F0XO1GC-mb-E > .F0XO1GC-nb-v {margin-top: 2px;}
..F0XO1GC-mb-C {padding-left: 20px; padding-top: 0px; margin-top: 2px;}
..F0XO1GC-mb-B {position: absolute; top: 1px; left: 10px; cursor: pointer;}
..F0XO1GC-mb-W {display: inline-block; position: relative;}
..F0XO1GC-mb-W .gwt-TabBarItem {cursor: pointer; font-weight: normal; positi=
on: relative; top: 1px; padding: 5px 10px; margin: 0px 3px; outline: medium=
none; background-color: rgb(245, 245, 245); border: 1px solid rgb(245, 245=
, 245);}
..F0XO1GC-mb-W .gwt-TabBarItem-selected {color: rgb(0, 0, 0); text-decoratio=
n: none; cursor: default; font-weight: bold; background-color: rgb(255, 255=
, 255); border-width: 1px; border-style: solid; border-color: rgb(235, 235,=
235) rgb(235, 235, 235) rgb(255, 255, 255); -moz-border-top-colors: none; =
-moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz-borde=
r-left-colors: none; border-image: none;}
..F0XO1GC-mb-I {width: 100%;}
..F0XO1GC-mb-Q {margin: 16px 0px; border-bottom: 1px solid rgb(235, 235, 235=
);}
..F0XO1GC-mb-L {margin: 0px 3px; vertical-align: middle;}
..F0XO1GC-mb-S {padding: 5px;}
..F0XO1GC-mb-R {padding-bottom: 10px;}
..F0XO1GC-mb-U {font-size: 14px; font-weight: bold;}
..F0XO1GC-mb-T {font-weight: bold;}
..F0XO1GC-mb-a {position: relative; border: 1px solid rgb(235, 235, 235); di=
splay: inline-block; margin: 5px; padding: 5px 0px 0px 5px;}
..F0XO1GC-mb-b {position: absolute; color: rgb(102, 102, 102); left: 5px; bo=
ttom: 5px;}
..F0XO1GC-mb-r {margin-left: 10px;}
..F0XO1GC-mb-j {font-weight: bold; text-decoration: underline; cursor: point=
er;}
..F0XO1GC-mb-i {margin: 0px 5px; position: relative; border: 2px solid rgb(2=
04, 204, 204); padding: 2px 2px 2px 8px; line-height: 1.5em; background-col=
or: rgb(255, 255, 255);}
..F0XO1GC-mb-H {margin-left: 18px; position: relative;}
..F0XO1GC-mb-G {position: relative;}
..F0XO1GC-mb-F {position: absolute; top: 0px; left: 0px; cursor: pointer;}
..F0XO1GC-mb-p {padding: 8px 16px; color: rgb(34, 0, 204); background-color:=
rgb(255, 238, 136); border: 1px solid rgb(188, 188, 188); position: absolu=
te; bottom: 4px; right: 4px;}
..F0XO1GC-mb-p .F0XO1GC-mb-h {margin-left: 4px; color: rgb(128, 128, 128); c=
ursor: pointer; text-decoration: underline;}
..F0XO1GC-mb-O ,.F0XO1GC-mb-d {border-top: 1px solid rgb(221, 221, 221); pad=
ding: 4px;}
..F0XO1GC-mb-ab .F0XO1GC-mb-O ,body .F0XO1GC-mb-O {border: 0px none; padding=
: 4px 8px; background-color: rgb(77, 144, 254); border-radius: 10px;}
..F0XO1GC-mb-ab .F0XO1GC-mb-O.F0XO1GC-mb-d ,body .F0XO1GC-mb-O.F0XO1GC-mb-d =
{border-bottom: 0px none; padding: 4px 8px; background-color: rgb(61, 148, =
0); color: white; border-radius: 10px;}
..F0XO1GC-mb-ab .F0XO1GC-mb-O span ,.F0XO1GC-mb-ab .F0XO1GC-mb-d span ,body =
..F0XO1GC-mb-O span ,body .F0XO1GC-mb-d span {font-size: 16px; font-weight: =
normal;}
..F0XO1GC-mb-O span ,.F0XO1GC-mb-d span {font-weight: bold;}
..F0XO1GC-mb-O span {color: rgb(102, 102, 102);}
..F0XO1GC-mb-d span {color: rgb(75, 195, 87);}
..F0XO1GC-mb-ab .F0XO1GC-mb-O span ,.F0XO1GC-mb-ab .F0XO1GC-mb-d span ,body =
..F0XO1GC-mb-O span ,body .F0XO1GC-mb-d span {color: white;}
..F0XO1GC-mb-g ,.F0XO1GC-mb-t ,.F0XO1GC-mb-e {display: inline-block;}
..F0XO1GC-mb-t {vertical-align: top; overflow: hidden; padding-left: 8px !im=
portant;}
..F0XO1GC-mb-ab .F0XO1GC-mb-t ,body .F0XO1GC-mb-t {position: relative; top: =
1px;}
..F0XO1GC-mb-s {text-align: right; padding-bottom: 10px;}
..F0XO1GC-mb-c {text-align: center;}
..F0XO1GC-mb-w img {height: 20px;}
..F0XO1GC-kb-c {display: inline; white-space: nowrap; padding: 0px 2px;}
..F0XO1GC-kb-b {color: rgb(238, 68, 68); font-size: 13px;}
..F0XO1GC-kb-a {font-size: 13px;}
..F0XO1GC-x-a .F0XO1GC-x-d {float: left;}
..F0XO1GC-x-a .F0XO1GC-x-e {float: right;}
..F0XO1GC-x-a .F0XO1GC-x-e td:last-child div {margin-right: 0px;}
..F0XO1GC-x-b {line-height: 24px; margin-bottom: 14px;}
..F0XO1GC-b-O .F0XO1GC-x-b ,body .F0XO1GC-x-b {line-height: 17px; margin-bot=
tom: 8px;}
..F0XO1GC-lb-a {color: rgb(102, 102, 102);}
..F0XO1GC-lb-e {border-radius: 2px; height: 22px;}
..F0XO1GC-lb-e > span {position: relative; top: -2px;}
..F0XO1GC-lb-d {z-index: 1021; padding: 10px; display: block; box-shadow: 0p=
x 2px 4px rgba(0, 0, 0, 0.2); outline: medium none; border: 1px solid rgb(2=
04, 204, 204);}
..F0XO1GC-lb-b {text-align: center; margin-bottom: 15px;}
..F0XO1GC-lb-c div {display: inline-block;}
..F0XO1GC-lb-c * {padding-left: 5px; padding-right: 5px;}
..gux-menu-button {background: rgba(0, 0, 0, 0) url("data:image/png;base64,i=
VBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJ=
bWFnZVJlYWR5ccllPAAAAwBQTFRFZmZm////AgICAwMDBAQEBQUFBgYGBwcHCAgICQkJCgoKCws=
LDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbHBwcHR0dHh=
4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioqKysrLCwsLS0tLi4uLy8vMDAwM=
TExMjIyMzMzNDQ0NTU1NjY2Nzc3ODg4OTk5Ojo6Ozs7PDw8PT09Pj4+Pz8/QEBAQUFBQkJCQ0ND=
RERERUVFRkZGR0dHSEhISUlJSkpKS0tLTExMTU1NTk5OT09PUFBQUVFRUlJSU1NTVFRUVVVVVlZ=
WV1dXWFhYWVlZWlpaW1tbXFxcXV1dXl5eX19fYGBgYWFhYmJiY2NjZGRkZWVlZmZmZ2dnaGhoaW=
lpampqa2trbGxsbW1tbm5ub29vcHBwcXFxcnJyc3NzdHR0dXV1dnZ2d3d3eHh4eXl5enp6e3t7f=
Hx8fX19fn5+f39/gICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqKi4uLjIyMjY2Njo6O=
j4+PkJCQkZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnZ2dnp6en5+foKCgoaG=
hoqKio6OjpKSkpaWlpqamp6enqKioqampqqqqq6urrKysra2trq6ur6+vsLCwsbGxsrKys7OztL=
S0tbW1tra2t7e3uLi4ubm5urq6u7u7vLy8vb29vr6+v7+/wMDAwcHBwsLCw8PDxMTExcXFxsbGx=
8fHyMjIycnJysrKy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU1dXV1tbW19fX2NjY2dnZ=
2tra29vb3Nzc3d3d3t7e39/f4ODg4eHh4uLi4+Pj5OTk5eXl5ubm5+fn6Ojo6enp6urq6+vr7Oz=
s7e3t7u7u7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+Pj4+fn5+vr6+/v7/Pz8/f39/v7+//=
//AADF2QAAAAJ0Uk5T/wDltzBKAAAAH0lEQVR42mJghAAGGJ0GAQyMYAokDqLA8mlI6gACDAC8p=
AaCn/ezogAAAABJRU5ErkJggg=3D=3D") no-repeat scroll right 50%; padding-right=
: 12px; text-align: left;}
..gux-menu-button-disabled {background: rgba(0, 0, 0, 0) url("data:image/png=
;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAAGXRFWHRTb2Z0d2FyZQB=
BZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFmZmZ////AgICAwMDBAQEBQUFBgYGBwcHCAgICQ=
kJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbH=
BwcHR0dHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioqKysrLCwsLS0tLi4u=
Ly8vMDAwMTExMjIyMzMzNDQ0NTU1NjY2Nzc3ODg4OTk5Ojo6Ozs7PDw8PT09Pj4+Pz8/QEBAQUF=
BQkJCQ0NDRERERUVFRkZGR0dHSEhISUlJSkpKS0tLTExMTU1NTk5OT09PUFBQUVFRUlJSU1NTVF=
RUVVVVVlZWV1dXWFhYWVlZWlpaW1tbXFxcXV1dXl5eX19fYGBgYWFhYmJiY2NjZGRkZWVlZmZmZ=
2dnaGhoaWlpampqa2trbGxsbW1tbm5ub29vcHBwcXFxcnJyc3NzdHR0dXV1dnZ2d3d3eHh4eXl5=
enp6e3t7fHx8fX19fn5+f39/gICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqKi4uLjIy=
MjY2Njo6Oj4+PkJCQkZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnZ2dnp6en5=
+foKCgoaGhoqKio6OjpKSkpaWlpqamp6enqKioqampqqqqq6urrKysra2trq6ur6+vsLCwsbGxs=
rKys7OztLS0tbW1tra2t7e3uLi4ubm5urq6u7u7vLy8vb29vr6+v7+/wMDAwcHBwsLCw8PDxMTE=
xcXFxsbGx8fHyMjIycnJysrKy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU1dXV1tbW19f=
X2NjY2dnZ2tra29vb3Nzc3d3d3t7e39/f4ODg4eHh4uLi4+Pj5OTk5eXl5ubm5+fn6Ojo6enp6u=
rq6+vr7Ozs7e3t7u7u7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+Pj4+fn5+vr6+/v7/Pz8/=
f39/v7+////uBOGsAAAAAJ0Uk5T/wDltzBKAAAAH0lEQVR42mJghAAGGD0TAhgYwRRIHESB5Wci=
qQMIMAAZIwmyA+lVoQAAAABJRU5ErkJggg=3D=3D") no-repeat scroll right 50%; padd=
ing-right: 12px;}
..gux-menu-button-selected {background: rgba(0, 0, 0, 0) url("data:image/png=
;base64,iVBORw0KGgoAAAANSUhEUgAAAAcAAAAHCAMAAADzjKfhAAAAGXRFWHRTb2Z0d2FyZQB=
BZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRFZmZm////AgICAwMDBAQEBQUFBgYGBwcHCAgICQ=
kJCgoKCwsLDAwMDQ0NDg4ODw8PEBAQEREREhISExMTFBQUFRUVFhYWFxcXGBgYGRkZGhoaGxsbH=
BwcHR0dHh4eHx8fICAgISEhIiIiIyMjJCQkJSUlJiYmJycnKCgoKSkpKioqKysrLCwsLS0tLi4u=
Ly8vMDAwMTExMjIyMzMzNDQ0NTU1NjY2Nzc3ODg4OTk5Ojo6Ozs7PDw8PT09Pj4+Pz8/QEBAQUF=
BQkJCQ0NDRERERUVFRkZGR0dHSEhISUlJSkpKS0tLTExMTU1NTk5OT09PUFBQUVFRUlJSU1NTVF=
RUVVVVVlZWV1dXWFhYWVlZWlpaW1tbXFxcXV1dXl5eX19fYGBgYWFhYmJiY2NjZGRkZWVlZmZmZ=
2dnaGhoaWlpampqa2trbGxsbW1tbm5ub29vcHBwcXFxcnJyc3NzdHR0dXV1dnZ2d3d3eHh4eXl5=
enp6e3t7fHx8fX19fn5+f39/gICAgYGBgoKCg4ODhISEhYWFhoaGh4eHiIiIiYmJioqKi4uLjIy=
MjY2Njo6Oj4+PkJCQkZGRkpKSk5OTlJSUlZWVlpaWl5eXmJiYmZmZmpqam5ubnJycnZ2dnp6en5=
+foKCgoaGhoqKio6OjpKSkpaWlpqamp6enqKioqampqqqqq6urrKysra2trq6ur6+vsLCwsbGxs=
rKys7OztLS0tbW1tra2t7e3uLi4ubm5urq6u7u7vLy8vb29vr6+v7+/wMDAwcHBwsLCw8PDxMTE=
xcXFxsbGx8fHyMjIycnJysrKy8vLzMzMzc3Nzs7Oz8/P0NDQ0dHR0tLS09PT1NTU1dXV1tbW19f=
X2NjY2dnZ2tra29vb3Nzc3d3d3t7e39/f4ODg4eHh4uLi4+Pj5OTk5eXl5ubm5+fn6Ojo6enp6u=
rq6+vr7Ozs7e3t7u7u7+/v8PDw8fHx8vLy8/Pz9PT09fX19vb29/f3+Pj4+fn5+vr6+/v7/Pz8/=
f39/v7+////AADF2QAAAAJ0Uk5T/wDltzBKAAAAH0lEQVR42mJghAAGGP0fAhgYwRRIHESB5f8j=
qQMIMADSAxASsJSVyQAAAABJRU5ErkJggg=3D=3D") no-repeat scroll right 50%; padd=
ing-right: 12px;}
..goog-inline-block {position: relative; display: inline-block;}
..F0XO1GC-G-a {border: 1px solid transparent; color: rgb(255, 255, 255); bac=
kground-color: rgb(209, 72, 54); background-image: -moz-linear-gradient(cen=
ter top , rgb(221, 75, 57), rgb(209, 72, 54)); text-shadow: 0px 1px rgba(0,=
0, 0, 0.1); text-transform: uppercase;}
..chrome-theme .F0XO1GC-G-a {background-color: rgb(3, 112, 234); background-=
image: -webkit-linear-gradient(top, rgb(0, 141, 253) 0%, rgb(3, 112, 234) 1=
00%); border: 1px solid rgb(7, 107, 210); text-shadow: 1px 1px 1px rgb(7, 1=
07, 210); text-transform: none;}
..F0XO1GC-G-a:hover {border-width: 1px; border-style: solid; border-color: r=
gb(176, 40, 26) rgb(176, 40, 26) rgb(175, 48, 31); -moz-border-top-colors: =
none; -moz-border-right-colors: none; -moz-border-bottom-colors: none; -moz=
-border-left-colors: none; border-image: none; background-color: rgb(197, 5=
5, 39); background-image: -moz-linear-gradient(center top , rgb(221, 75, 57=
), rgb(197, 55, 39)); box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.2);}
..F0XO1GC-G-a:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) inset; o=
utline: 0px none rgba(0, 0, 0, 0);}
..chrome-theme .F0XO1GC-G-a:focus {box-shadow: none; outline: medium none !i=
mportant; border: 1px solid rgb(6, 73, 144);}
..F0XO1GC-G-a:active {background-color: rgb(176, 40, 26); border: 1px solid =
rgb(153, 42, 27); background-image: -moz-linear-gradient(center top , rgb(2=
21, 75, 57), rgb(176, 40, 26)); box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) =
inset;}
..chrome-theme .F0XO1GC-G-a:hover ,.chrome-theme .F0XO1GC-G-a:active {backgr=
ound-color: rgb(3, 112, 234); border: 1px solid rgb(7, 107, 210); backgroun=
d-image: -webkit-linear-gradient(top, rgb(0, 141, 253) 30%, rgb(3, 112, 234=
) 100%);}
..F0XO1GC-G-a.F0XO1GC-n-b {background: rgb(209, 72, 54) none repeat scroll 0=
% 0%;}
..F0XO1GC-nb-W {position: relative; border-top: 1px solid transparent; borde=
r-bottom: 1px solid transparent; border-left: 1px solid transparent; margin=
-right: 0px; padding-right: 0px;}
..F0XO1GC-nb-F {margin-right: 0px;}
..F0XO1GC-nb-X {border-left: 1px solid rgb(77, 144, 240);}
..F0XO1GC-nb-X:focus {outline: medium none;}
..F0XO1GC-nb-Y {padding: 4px 0px;}
..F0XO1GC-nb-V {padding-top: 4px; padding-bottom: 4px; background-position: =
0px 9px;}
..F0XO1GC-b-Nb .F0XO1GC-nb-Y ,.F0XO1GC-b-Nb .F0XO1GC-nb-V {background-color:=
rgb(255, 255, 255);}
..F0XO1GC-nb-O {width: 100%;}
..F0XO1GC-nb-P {color: rgb(34, 34, 34); line-height: normal;}
..F0XO1GC-nb-P p {line-height: normal; margin: 1em 0px;}
..F0XO1GC-nb-p {width: 34px; padding: 5px;}
..F0XO1GC-nb-kb {border-bottom: 1px solid rgb(221, 221, 221); margin-bottom:=
8px;}
..F0XO1GC-nb-lb {margin-bottom: 8px;}
..F0XO1GC-nb-v {margin-top: 0px;}
..F0XO1GC-nb-w {padding: 2px 5px;}
..F0XO1GC-nb-w .F0XO1GC-nb-O {padding-bottom: 1px;}
..F0XO1GC-nb-a {position: relative; padding: 4px 0px;}
..F0XO1GC-nb-b {padding-left: 5px; margin-left: 39px; margin-right: 0px !imp=
ortant;}
..F0XO1GC-nb-c {display: inline-block;}
..F0XO1GC-nb-a .F0XO1GC-nb-jb {margin-right: 1em;}
..F0XO1GC-nb-G {vertical-align: inherit;}
..F0XO1GC-nb-G span {line-height: 27px; vertical-align: inherit;}
..F0XO1GC-nb-G img {top: 0px; vertical-align: top;}
..F0XO1GC-nb-d {float: right; text-align: right; line-height: 27px;}
..F0XO1GC-nb-d a {text-decoration: none; color: rgb(102, 136, 221); cursor: =
pointer; vertical-align: middle;}
..F0XO1GC-nb-U {font-size: 11px; float: right; line-height: 27px;}
..F0XO1GC-nb-O table {width: 100%;}
..F0XO1GC-nb-O td {vertical-align: top;}
..F0XO1GC-nb-Q {white-space: nowrap;}
..F0XO1GC-nb-R {height: 1.5em; cursor: pointer; padding-right: 5px; padding-=
bottom: 5px; padding-left: 5px; white-space: nowrap; overflow: hidden; padd=
ing-top: 6px !important;}
..F0XO1GC-nb-T {text-align: right;}
..F0XO1GC-nb-N {padding: 5px; vertical-align: middle;}
..F0XO1GC-nb-ab {white-space: pre-wrap; margin: 0px;}
..F0XO1GC-nb-H {background-color: rgb(211, 222, 255); padding: 5px;}
..F0XO1GC-nb-H input {width: 100%; display: block; border: 1px solid rgb(102=
, 136, 238); margin: 5px 0px;}
..F0XO1GC-nb-m {color: rgb(51, 51, 51); text-decoration: none; cursor: defau=
lt;}
..F0XO1GC-nb-m img {opacity: 1;}
..F0XO1GC-nb-hb ,.F0XO1GC-nb-D {padding: 4px 5px 3px 0px; white-space: nowra=
p;}
..F0XO1GC-nb-L {display: inline-block; margin-top: 4px;}
..F0XO1GC-nb-ib {display: inline-block;}
..F0XO1GC-nb-I {margin-left: -8px;}
..F0XO1GC-nb-J {margin-right: 0px;}
..F0XO1GC-nb-M {display: inline-block;}
..F0XO1GC-nb-K {margin-left: 13px;}
..F0XO1GC-nb-o {border-top: 1px solid rgb(221, 221, 221); padding: 5px; marg=
in-top: 5px;}
..F0XO1GC-nb-eb {color: rgb(136, 136, 136); height: 1.5em; overflow: hidden;=
line-height: 1.5em;}
..F0XO1GC-nb-w .F0XO1GC-nb-Q {line-height: 1.5em;}
..F0XO1GC-nb-fb {padding: 0px 4px; vertical-align: top;}
..F0XO1GC-nb-w .F0XO1GC-nb-Q {float: right; padding-right: 2px; padding-left=
: 8px;}
..F0XO1GC-nb-w .F0XO1GC-nb-z {float: right;}
..F0XO1GC-nb-w {cursor: pointer;}
..F0XO1GC-nb-v .F0XO1GC-nb-a ,.F0XO1GC-nb-v .F0XO1GC-nb-l {display: none;}
..F0XO1GC-nb-Z .gux-confirm-panel {padding: 4px; text-align: center;}
..F0XO1GC-nb-Z .F0XO1GC-nb-eb {padding: 4px;}
..F0XO1GC-nb-C {padding: 4px; text-align: center; background-color: rgb(239,=
239, 239);}
..F0XO1GC-nb-S {border-bottom: 1px solid rgb(221, 221, 221); margin-bottom: =
8px; padding-bottom: 8px;}
..F0XO1GC-nb-t {font-weight: bold;}
..F0XO1GC-nb-r {width: 15%; font-weight: bold;}
..F0XO1GC-nb-q {width: 85%;}
..F0XO1GC-nb-s {font-size: 12px; white-space: nowrap; text-decoration: under=
line; color: rgb(119, 136, 204); cursor: pointer;}
..F0XO1GC-nb-y {margin-top: 8px; border-top: 1px solid rgb(221, 221, 221);}
..F0XO1GC-nb-n {vertical-align: middle; margin-right: 5px; float: left;}
..F0XO1GC-nb-x .F0XO1GC-nb-gb ,body .F0XO1GC-nb-gb {float: left; margin: 0px=
10px;}
..F0XO1GC-nb-w .F0XO1GC-nb-gb ,.F0XO1GC-nb-x .F0XO1GC-nb-gb ,body .F0XO1GC-n=
b-gb {position: relative; top: -4px;}
..F0XO1GC-nb-e {float: right; white-space: nowrap; margin-top: 5px !importan=
t;}
..F0XO1GC-nb-i {display: inline-block; white-space: nowrap; text-align: cent=
er; height: 27px;}
..F0XO1GC-nb-f {padding: 0px;}
..F0XO1GC-nb-k {min-width: 0px; width: 13px; height: 27px; margin-right: 0px=
;}
..F0XO1GC-nb-k .F0XO1GC-k-b {margin-left: 0px;}
..F0XO1GC-nb-g span {margin-left: 24px; margin-right: 4px;}
..F0XO1GC-nb-g img {position: absolute; top: 4px; left: 12px;}
..F0XO1GC-nb-bb {display: inline-block;}
..chrome-theme .F0XO1GC-nb-P {color: rgb(119, 119, 119);}
..chrome-theme .F0XO1GC-nb-P a ,.chrome-theme .F0XO1GC-nb-P a:visited {color=
: rgb(0, 0, 0) !important; font-weight: 600 !important; text-decoration: no=
ne !important;}
..chrome-theme .F0XO1GC-nb-P a:hover ,.chrome-theme .F0XO1GC-nb-P a:active {=
color: rgb(51, 153, 255) !important;}
..F0XO1GC-nb-A {min-width: 34px;}
..F0XO1GC-nb-E {color: rgb(119, 119, 119);}
..F0XO1GC-nb-E > img {position: relative; top: 2px; padding-right: 4px;}
..F0XO1GC-nb-E > span {padding-right: 4px;}
..F0XO1GC-nb-u {padding-right: 4px; vertical-align: top;}
..F0XO1GC-nb-E .F0XO1GC-nb-u {vertical-align: baseline;}
..F0XO1GC-nb-E .F0XO1GC-D-c {vertical-align: middle !important;}
..F0XO1GC-nb-E .F0XO1GC-D-a {vertical-align: baseline;}
..F0XO1GC-Db-a {color: rgb(153, 153, 153); cursor: pointer; font-size: 9px;}
..F0XO1GC-Db-b {color: rgb(136, 136, 136);}
..F0XO1GC-ld-d {margin-left: auto; margin-right: auto;}
..F0XO1GC-ld-c {width: 100%; min-width: 400px;}
..F0XO1GC-ld-a {resize: vertical;}
..F0XO1GC-ld-b {font-weight: bold;}
..F0XO1GC-F-a {background-color: rgba(255, 255, 255, 0.65); border: 1px soli=
d rgb(198, 198, 198); border-radius: 1px; height: 13px; margin: 0px 1px; ou=
tline: medium none; vertical-align: text-bottom; width: 13px; display: inli=
ne-block; position: relative;}
..F0XO1GC-F-h {display: block; position: absolute; width: 15px; height: 15px=
; top: -2px; left: 1px;}
..F0XO1GC-F-c .F0XO1GC-F-h {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/menu/checkmark.png") no-repeat scroll -5px -3px;}
..F0XO1GC-F-k .F0XO1GC-F-h {opacity: 0.3;}
..F0XO1GC-F-b {background-color: rgb(235, 235, 235);}
..F0XO1GC-F-f {border: 1px solid rgb(102, 102, 102); box-shadow: 0px 1px 1px=
rgba(0, 0, 0, 0.1) inset;}
..F0XO1GC-F-e {border: 1px solid rgb(77, 144, 254);}
..F0XO1GC-F-k .F0XO1GC-F-a {background-color: rgba(255, 255, 255, 0.45); bor=
der: 1px solid rgb(241, 241, 241);}
..F0XO1GC-F-g .F0XO1GC-F-h {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/menu/checkmark-partial.png") no-repeat scroll -5px -3px;}
..F0XO1GC-F-i {margin-left: 5px;}
..F0XO1GC-F-k .F0XO1GC-F-i {color: rgb(184, 184, 184);}
..F0XO1GC-F-j {cursor: default; outline: medium none; line-height: 24px;}
..jfk-button-action {border: 1px solid rgb(48, 121, 237); color: rgb(255, 25=
5, 255); background-color: rgb(77, 144, 254); background-image: -moz-linear=
-gradient(center top , rgb(77, 144, 254), rgb(71, 135, 237));}
..chrome-theme .jfk-button-action {background-color: rgb(3, 112, 234); backg=
round-image: -webkit-linear-gradient(top, rgb(0, 141, 253) 0%, rgb(3, 112, =
234) 100%); border: 1px solid rgb(7, 107, 210); text-shadow: 1px 1px 1px rg=
b(7, 107, 210);}
..jfk-button-action:hover {color: rgb(255, 255, 255); border: 1px solid rgb(=
47, 91, 183); background-color: rgb(53, 122, 232); background-image: -moz-l=
inear-gradient(center top , rgb(77, 144, 254), rgb(53, 122, 232));}
..chrome-theme .jfk-button-action:hover {background-color: rgb(3, 112, 234);=
background-image: -webkit-linear-gradient(top, rgb(0, 141, 253) 30%, rgb(3=
, 112, 234) 100%); border: 1px solid rgb(7, 107, 210);}
..jfk-button-action:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset=
;}
..jfk-button-action:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) in=
set; outline: 0px none rgba(0, 0, 0, 0);}
..chrome-theme .jfk-button-action:focus {box-shadow: none; outline: medium n=
one !important; border: 1px solid rgb(6, 73, 144);}
..F0XO1GC-ed-a {padding-left: 5px; margin-left: 44px;}
..F0XO1GC-md-a {position: relative; height: 34px; margin-top: 4px;}
..F0XO1GC-md-c {text-decoration: underline;}
..F0XO1GC-md-b {border-width: 1px !important; border-style: solid !important=
; border-color: silver rgb(217, 217, 217) rgb(217, 217, 217) !important; -m=
oz-border-top-colors: none !important; -moz-border-right-colors: none !impo=
rtant; -moz-border-bottom-colors: none !important; -moz-border-left-colors:=
none !important; border-image: none !important; box-sizing: border-box; bo=
rder-radius: 1px; transition: none 0s ease 0s ; background-color: white; co=
lor: rgb(153, 153, 153); padding: 8px 0px 0px 12px; position: absolute; top=
: 0px; right: 0px; left: 4px; height: 34px;}
..F0XO1GC-H-d {display: inline-block; height: 13px; padding: 5px; text-align=
: center; width: 13px; cursor: pointer;}
..F0XO1GC-H-d .F0XO1GC-H-c {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/star/star2.png") no-repeat scroll 0% 0%; height: 13px; width: 13p=
x;}
..F0XO1GC-H-b .F0XO1GC-H-c {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/star/star2.png") no-repeat scroll 0% 0%;}
..F0XO1GC-H-a .F0XO1GC-H-c {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/ui/v1/star/star-lit.png") no-repeat scroll 0% 0%;}
..F0XO1GC-D-d {vertical-align: top; padding-left: 2px;}
..F0XO1GC-D-c {padding-left: 4px; vertical-align: top;}
..F0XO1GC-D-a {font-weight: bold; white-space: nowrap; vertical-align: top; =
cursor: default;}
..F0XO1GC-D-b {color: rgb(102, 102, 102); vertical-align: top; white-space: =
nowrap; margin-left: 4px;}
..F0XO1GC-pb-d {background-color: rgb(255, 255, 255); box-shadow: 0px 2px 4p=
x 0px rgba(0, 0, 0, 0.2); padding: 10px; z-index: 1021;}
..F0XO1GC-pb-b {padding-top: 5px; padding-bottom: 5px; font-size: 11px; colo=
r: rgb(102, 102, 102);}
..F0XO1GC-pb-g {width: 100%;}
..F0XO1GC-pb-e {display: block;}
..F0XO1GC-pb-c {display: block; width: 100%;}
..F0XO1GC-pb-f {display: block;}
..gwt-SuggestBoxPopup {overflow: auto !important; max-height: 240px; z-index=
: 1021;}
..F0XO1GC-b-N .gwt-SuggestBoxPopup {line-height: 26px !important;}
..F0XO1GC-b-O .gwt-SuggestBoxPopup ,body .gwt-SuggestBoxPopup {line-height: =
20px !important;}
..item {position: relative;}
..F0XO1GC-b-N .item {line-height: 26px !important;}
..F0XO1GC-b-O .item ,body .item {line-height: 20px !important;}
..item-selected {position: relative;}
td > strong {color: orange;}
..F0XO1GC-j-f .F0XO1GC-pb-d {box-shadow: none;}
..F0XO1GC-vb-p {padding: 8px;}
..F0XO1GC-vb-r {padding-bottom: 20px;}
..F0XO1GC-vb-a {padding: 16px 0px;}
..F0XO1GC-vb-a .goog-button-base {margin-right: 1em;}
..F0XO1GC-vb-z {width: 99%; display: block; border: 1px solid rgb(102, 136, =
238); margin: 5px 0px;}
..F0XO1GC-vb-A {padding-top: 8px;}
..F0XO1GC-vb-i .gwt-CheckBox {white-space: nowrap; padding-right: 1em; displ=
ay: inline-block;}
..F0XO1GC-vb-g {width: 25px; font-weight: bold; text-align: left; padding: 1=
0px 18px 0px 0px; vertical-align: top; white-space: nowrap; color: rgb(153,=
153, 153);}
..F0XO1GC-vb-h {width: 99%; border: 1px solid rgb(102, 136, 238); margin: 3p=
x 0px 3px 3px; font-size: 13px;}
..F0XO1GC-vb-f {color: rgb(136, 136, 136); font-size: 85%; text-decoration: =
none;}
..F0XO1GC-vb-k {background-color: white; max-width: 99%;}
..F0XO1GC-vb-q ,.F0XO1GC-vb-l ,.F0XO1GC-vb-E ,.F0XO1GC-vb-F ,body {min-heigh=
t: 200px; max-width: 100%; overflow: auto; outline: medium none; margin-bot=
tom: 4px;}
..F0XO1GC-vb-q {resize: none;}
..F0XO1GC-vb-E ,.F0XO1GC-vb-F ,body {height: 200px; resize: vertical;}
..F0XO1GC-vb-q ,.F0XO1GC-vb-F {padding: 4px;}
..F0XO1GC-vb-b {margin: 8px 0px;}
..F0XO1GC-vb-b td {vertical-align: middle;}
..F0XO1GC-vb-b a {cursor: pointer; padding: 0px 4px;}
..F0XO1GC-vb-j {white-space: nowrap;}
..F0XO1GC-vb-j a {text-decoration: underline;}
..F0XO1GC-vb-v {cursor: pointer; margin-left: 4px;}
..F0XO1GC-vb-e {padding-left: 10px;}
..F0XO1GC-vb-B {font-weight: bold; margin-bottom: 8px;}
..F0XO1GC-vb-w {margin-bottom: 5px; margin-right: 5px;}
..F0XO1GC-vb-x {max-width: 99%; overflow: hidden; transition: all 0.15s ease=
-in-out 0s;}
..F0XO1GC-vb-C {margin-bottom: 8px;}
..F0XO1GC-vb-o {color: rgb(136, 136, 136); text-decoration: none;}
..F0XO1GC-vb-y {font-weight: bold;}
..F0XO1GC-vb-n {border-bottom: 1px solid rgb(235, 235, 235); padding: 14px 0=
px 8px;}
..F0XO1GC-vb-c {display: inline-block; margin-right: 8px; position: relative=
; top: 6px;}
..F0XO1GC-vb-d {display: inline-block;}
..F0XO1GC-vb-D {font-weight: bold;}
..F0XO1GC-vb-u {display: inline-block; vertical-align: middle;}
..F0XO1GC-vb-t {padding-top: 3px;}
..F0XO1GC-vb-s {padding: 0px 5px 0px 15px;}
..F0XO1GC-vb-m {margin-right: 12px;}
..F0XO1GC-Uc-a {background: white none repeat scroll 0% 0%; min-width: 140px=
; overflow: hidden; white-space: nowrap;}
..F0XO1GC-Uc-c {background-color: white; border: medium none; font-size: 11p=
x; overflow: hidden; outline: medium none; margin: 2px 0px; width: 100%;}
..F0XO1GC-Uc-d {display: inline-block; margin: 0px; padding: 0px; width: 100=
%;}
..F0XO1GC-Lc-h {width: 99%; display: block; border: 1px solid rgb(102, 136, =
238); margin: 5px 0px;}
..F0XO1GC-Lc-d {font-size: 11px; color: rgb(136, 136, 136);}
..F0XO1GC-Lc-e {font-size: 11px; text-decoration: none; white-space: nowrap;=
}
..F0XO1GC-Lc-c {white-space: nowrap; padding-bottom: 2px;}
..F0XO1GC-Lc-a {color: rgb(136, 136, 136);}
..F0XO1GC-Lc-b {color: rgb(153, 0, 0); font-size: 11px;}
..F0XO1GC-Lc-g {height: 2em; overflow: hidden; margin-right: 10px; padding-b=
ottom: 5px;}
..F0XO1GC-Lc-f {line-height: 14px;}
..F0XO1GC-vc-a {font-style: italic;}
..jfk-button-default {color: rgb(255, 255, 255); text-shadow: 0px 1px rgba(0=
, 0, 0, 0.1); border: 1px solid rgb(41, 105, 29); background-color: rgb(61,=
148, 0); background-image: -moz-linear-gradient(center top , rgb(61, 148, =
0), rgb(57, 138, 0));}
..jfk-button-default:hover {border: 1px solid rgb(45, 98, 0); text-shadow: 0=
px 1px rgba(0, 0, 0, 0.3); background-color: rgb(54, 130, 0); background-im=
age: -moz-linear-gradient(center top , rgb(61, 148, 0), rgb(54, 130, 0));}
..jfk-button-default:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inse=
t;}
..jfk-button-default:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) i=
nset; outline: 0px none rgba(0, 0, 0, 0);}
..F0XO1GC-rc-c {display: inline-block; cursor: default; padding: 4px; positi=
on: relative;}
..F0XO1GC-rc-e {height: 18px; width: 18px; overflow: hidden; background: rgb=
a(0, 0, 0, 0) url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCA=
QAAAD8x0bcAAABG0lEQVR4AZXRP04CQRiG8ekIibFhgG4rK2WR8KfVwitAaL2BsXgCFB7AgkAoC=
SE0XsATcAJtjSWCsbIjwFCsb7JkJiEWuk/zFr9kk/nMvz/ytOmpNhYTCrPIjD3JIceUwjGK+WRD=
nyoZVWPAlhUlAqIosuBCK+KOeyKtmKXKBzRjgwjXrEnUmisMZXZMDkh6Tx8tXnkjUu+8YNQQh01=
Rm4QqWjxwg1GPOIyqk9BKUU8zg/GdseAZLbIkdH9DMd/MOfWoE35X8+iJL04Ou0FCM0UWx8CjSy=
p+j3DkhFBM2RKT7rlKV4Ud4/BOBVYsKaPNrUrJig+sR6oktGVInaxqMGIncn584DwTXDgwYywmo=
JClRZcOTXKYkOEP/QCM69uSuWj5UAAAAABJRU5ErkJggg=3D=3D") no-repeat scroll 0px =
0px;}
..F0XO1GC-rc-b {display: inline-block;}
..F0XO1GC-rc-c:hover > .F0XO1GC-rc-d ,.F0XO1GC-rc-c:focus > .F0XO1GC-rc-d {d=
isplay: block; z-index: 10;}
..F0XO1GC-rc-g .F0XO1GC-rc-d {right: 0px;}
..F0XO1GC-rc-d {background-color: white; border: 1px solid rgb(187, 187, 187=
); color: black; display: none; font-family: "Roboto",Arial,sans-serif; fon=
t-size: 13px; font-variant: normal; font-weight: normal; line-height: 17px;=
margin: 10px -10px; max-width: 300px; padding: 15px; position: absolute; w=
hite-space: normal; width: 290px;}
..F0XO1GC-rc-a {left: 9px; position: absolute; top: -9px;}
..F0XO1GC-rc-g .F0XO1GC-rc-a {left: inherit; right: 33px;}
..F0XO1GC-rc-h {border-width: 0px 9px 9px; border-style: solid; -moz-border-=
top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors=
: none; -moz-border-left-colors: none; border-image: none; border-color: rg=
b(187, 187, 187) transparent; display: block; left: 0px; position: absolute=
; top: 0px;}
..F0XO1GC-rc-f {border-width: 0px 9px 9px; border-style: solid; -moz-border-=
top-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors=
: none; -moz-border-left-colors: none; border-image: none; border-color: wh=
ite transparent; display: block; left: 0px; position: absolute; top: 1px; z=
-index: 120;}
..F0XO1GC-Q-a {margin: 0px 0px 0px 0.8ex; border-left: 1px solid rgb(204, 20=
4, 204); padding-left: 1ex;}
..F0XO1GC-Q-b {margin: 0px 0.8ex; border-style: solid; border-color: rgb(204=
, 204, 204); -moz-border-top-colors: none; -moz-border-right-colors: none; =
-moz-border-bottom-colors: none; -moz-border-left-colors: none; border-imag=
e: none; border-width: 0px 1px; padding: 0px 1ex;}
..F0XO1GC-Q-c {position: relative; top: 5px; height: 16px; width: 16px; over=
flow: hidden; background: rgba(0, 0, 0, 0) url("data:image/png;base64,iVBOR=
w0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAyElEQVR4Xs2SzQpBURSFlzfwBEp5FIkB=
j8AAeQYDZeDh8ACERMwUA6b+1mpT2z4Z3cn96qvTXrtz7jl3A3mjRpf0Ttuu3vnUFrTq6glbWGO=
PFl1d6wF90I2rJ7zoIRYdR/qMxS8F2Aa7GDj2sB71JpRh4SwGjjmspxSDEb3QE22GzNOC9Zzp0A=
cTeoPdv+6DQAP2Dlc6/o2ACuzzpjFw6Hrq0XUTMj+iyPQbhU7XIPWRDlIXNkgatr/oAdewRj/KW=
mvjFWzcc8QbzwI0QWHWGZ4AAAAASUVORK5CYII=3D") no-repeat scroll 0px 0px;}
..picker-framepane-root {position: absolute; width: 100%; height: 100%;}
* .picker-framepane-root ,body .picker-framepane-root {overflow: hidden;}
..picker-framepane-content {position: absolute; top: 0px; left: 0px; right: =
0px; bottom: 0px; overflow: hidden;}
* html .picker-framepane-content ,body .picker-framepane-content {position:=
relative; top: 0px; left: 0px; right: 0px; bottom: 0px; width: 100%; heigh=
t: 100%;}
..picker-framepane-top ,.picker-framepane-bottom {position: absolute; left: =
0px; right: 0px;}
* html .picker-framepane-top ,* html .picker-framepane-bottom ,body .picker=
-framepane-top ,body .picker-framepane-bottom {width: 100%;}
..picker-framepane-top {top: 0px;}
..picker-framepane-bottom {bottom: 0px;}
..picker-framepane-left ,.picker-framepane-right {overflow: auto; position: =
absolute; top: 0px; bottom: 0px;}
* html .picker-framepane-left ,* html .picker-framepane-right ,body .picker=
-framepane-left ,body .picker-framepane-right {height: 100%;}
..picker-framepane-left {left: 0px;}
..picker-framepane-right {right: 0px;}
..picker-actionpane-frame {background-color: rgb(255, 255, 255); border-top:=
1px solid rgb(229, 229, 229);}
..picker-actionpane-content {overflow: hidden;}
..picker-actionpane-frame .jfk-button {margin-top: 20px;}
..picker-actionpane-icon {margin-right: 8px; font-size: 13px; vertical-align=
: middle; background-image: url("//ssl.gstatic.com/docs/picker/images/apps_=
upload_icons-v1.gif") !important; background-position: center 0px; height: =
16px; width: 16px;}
..picker-actionpane-photomove-div {padding: 4px;}
..picker-actionpane-photomove {font-size: 13px; padding-left: 6px; vertical-=
align: bottom;}
:first-child + html .picker-navhidden .picker-actionpane-root {padding-left=
: 10px;}
..picker-navhidden.picker-chrome-none .picker-actionpane-root {bottom: 0px; =
left: 0px; right: 0px;}
..picker-chrome-none .picker-actionpane-content {margin-bottom: 5px;}
..picker-chrome-none .picker-framepane-hidden .picker-actionpane-content {ma=
rgin-bottom: 0px;}
* html .picker-actionpane-content ,body .picker-actionpane-content {padding=
-right: 6px; padding-bottom: 6px;}
..picker-actionpane-float-item {-moz-user-select: none; float: left; margin:=
0px 20px; height: 100%;}
..picker-people-picker .picker-actionpane-float-item {float: right;}
..picker-actionpane-uploading-message {padding: 8px 20px 0px 0px;}
..picker-actionpane-upload-status {color: rgb(68, 68, 68); font-size: 12px; =
max-width: 320px; padding: 17px 0px; position: absolute; right: 0px; top: 0=
px;}
..picker-actionpane-upload-status .picker-progress-bar.progress-bar-horizont=
al {height: 9px; border: 1px solid rgb(153, 153, 153); margin: 1px; padding=
: 1px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; width: 100%=
; vertical-align: middle;}
..picker-actionpane-attachment-label {color: rgb(85, 85, 85); display: inlin=
e-block; font-size: 12px; margin-right: 10px;}
..picker-actionpane-attachment-type-float-item {float: right; margin: 20px;}
..picker-actionpane-attachment-type-float-item .jfk-button {vertical-align: =
middle; margin: 0px;}
..picker-segmentedbuttonbar .picker-actionpane-imagebutton-icon {display: in=
line-block; float: left; margin-top: 3px;}
..picker-segmentedbuttonbar .picker-actionpane-imagebutton-text {display: in=
line-block; font-size: 11px; line-height: 21px; margin-top: 3px;}
..picker-actionpane-frame .picker-segmentedbuttonbar {display: inline-block;=
outline: medium none; position: relative; z-index: 0;}
..picker-segmentedbuttonbar .jfk-button-standard.jfk-button-selected ,.picke=
r-segmentedbuttonbar .jfk-button-standard.jfk-button-clear-outline.jfk-butt=
on-selected {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; background-c=
olor: rgb(238, 238, 238); background-image: -moz-linear-gradient(center top=
, rgb(238, 238, 238), rgb(224, 224, 224)); transition: all 0.1s ease 0s; b=
order: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..picker-actionpane-upload-status .progress-bar-horizontal .progress-bar-thu=
mb {height: 100%; background-repeat: repeat-x; background-size: 20px 10px; =
background-color: rgb(204, 204, 204); background-attachment: scroll; backgr=
ound-image: linear-gradient(315deg, transparent, transparent 33%, rgba(0, 0=
, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%, transparent 66%, transparent); ani=
mation-duration: 0.8s; animation-iteration-count: infinite; animation-timin=
g-function: linear;}
:first-child + html .picker-actionpane-float-item {float: right; margin: 0p=
x; padding-left: 4px;}
..picker-actionpane-frame .goog-imageless-button-content {padding: 6px 14px =
!important;}
..picker-actionpane-frame .goog-imageless-button {margin-left: 8px;}
:first-child + html .picker-actionpane-frame .goog-imageless-button {margin=
-left: 4px;}
..picker-actionpane-frame .goog-link-button {margin-top: 1px;}
..picker-actionpane-actionpanetext {float: right; font-size: 13px; margin: 2=
6px 37px 0px 0px; color: rgb(170, 170, 170);}
..picker-actionpane-upload-button-float-item {float: right;}
..picker-actionpane-upload-button {display: inline-block; float: right; marg=
in: 16px 23px;}
..picker-action-upload-button-img {margin-top: -3px; margin-right: 4px; vert=
ical-align: middle;}
..picker-main-overlay {position: absolute; background-color: rgb(255, 255, 2=
55); z-index: 2200; top: 0px; right: 0px; bottom: 0px; left: 0px; cursor: w=
ait;}
..picker-busy {opacity: 0.6; background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/docs/picker/images/loading-32-v1.gif") no-repeat scroll 50% 50%;}
..picker-gplus.picker-main-container {background-color: rgb(231, 231, 231);}
..picker-people-picker.picker-main-container {background-color: rgb(255, 255=
, 255);}
..picker-main-container .goog-link-button {color: rgb(17, 85, 204); text-dec=
oration: none; font-size: 13px; cursor: pointer; padding: 9px 2px; outline:=
medium none;}
..picker-main-container .goog-link-button-hover ,.picker-main-container .goo=
g-link-button-focused {text-decoration: underline;}
..picker-attributionbar-frame {background-color: rgb(255, 255, 255); border-=
top: 1px solid rgb(229, 229, 229); color: rgb(170, 170, 170); font-size: 11=
px; padding: 10px 20px; z-index: 2115;}
..picker-attributionbar-line {white-space: nowrap; overflow: hidden;}
..picker-actionpane-legal-text ,.picker-actionpane-notice {height: 100%; pad=
ding-right: 20px; cursor: default;}
..picker-actionpane-legal-text-td ,.picker-actionpane-notice-td {color: rgb(=
170, 170, 170); font-size: 13px; padding: 0px 20px 0px 10px; vertical-align=
: middle;}
..picker-actionpane-notice-link {cursor: pointer;}
..picker-actionpane-notice-error {color: rgb(204, 51, 51); font-size: 13px;}
..picker-actionpane-notice-warning {color: rgb(85, 85, 85); font-size: 11px;=
}
..picker-actionpane-notice-popup {font-size: 13px;}
..picker-actionpane-notice-popup .jfk-bubble-content-id {width: 300px;}
..picker-googlelogo-large {height: 44px; width: 120px;}
..picker-googlelogo-small {height: 20px; width: 52px;}
..picker-msgbar.jfk-butterBar {width: 75%; margin: auto; position: absolute;=
left: 0px; right: 0px; top: 10px; height: auto;}
..picker-msgbar.jfk-butterBar-shown {height: auto;}
..picker-msgbar.jfk-butterBar-warning .picker-link {color: rgb(255, 255, 255=
);}
..picker-main-container .goog-control {cursor: pointer;}
..picker-licensebar {color: rgb(68, 68, 68); font-size: 11px; margin-top: 7p=
x;}
..picker-loadingstatusbox {position: absolute; z-index: 100; padding: 2px 2p=
x 1px 4px; top: 50%; left: 50%; height: 32px; width: 32px; margin-top: -16p=
x; margin-left: -16px;}
..picker-loadingstatusbox-body {z-index: -1;}
..picker-photoupload-albumchooser-select {width: 242px; text-align: left; ma=
rgin: 0px; padding: 6px 10px;}
..picker-photoupload-albumchooser-select .goog-flat-menu-button-caption {wid=
th: 222px; padding: 0px 10px 0px 0px; overflow: hidden; text-overflow: elli=
psis; font-size: 11px; font-weight: bold; color: rgb(68, 68, 68); white-spa=
ce: nowrap; top: 1px; height: 16px;}
..picker-photoupload-albumchooser-select {height: 16px;}
..picker-photoupload-albumchooser-select .goog-flat-menu-button-caption ,.pi=
cker-photoupload-albumchooser-select .goog-flat-menu-button-dropdown ,.pick=
er-photoupload-albumchooser-select {line-height: normal;}
..picker-photoupload-albumchooser-select-menu {height: 180px; overflow: auto=
; z-index: 2200; width: 300px;}
..picker-photoupload-albumchooser-select-menu .goog-menuitem-content {text-o=
verflow: ellipsis; overflow: hidden;}
..picker-header-frame {padding: 17px 20px;}
..picker-header-content {border-top: 1px solid rgb(229, 229, 229);}
..picker-header-text {-moz-user-select: none; display: inline-block; font-si=
ze: 20px; vertical-align: top;}
..picker-header-icon {display: inline-block; margin: 0px 5px 5px 0px;}
..picker-dogfood-confidential-text {color: rgb(221, 75, 57); font-size: 13px=
; font-weight: bold; line-height: 25px; padding-left: 30px; text-transform:=
uppercase;}
..picker-header-close {line-height: 0; overflow: hidden; position: absolute;=
right: 11px; top: 20px;}
..picker-header-close .jfk-button-flat {cursor: pointer; height: inherit; ma=
rgin: 0px; width: inherit;}
..picker-debug-build-label {-moz-user-select: initial; background-color: rgb=
(255, 255, 255); color: rgb(153, 153, 153); font-size: 10px; position: abso=
lute; right: 10px; top: 0px;}
..picker-quotaview {padding: 21px; font-size: 13px;}
..picker-quotaview-div {margin-bottom: 10px;}
..picker-dropdown-menuitem {padding: 2px 7em 2px 30px; border: 0px none;}
..picker-dropdown-menuitem-header {color: rgb(153, 153, 153); cursor: defaul=
t; font-size: 11px; font-weight: bold; padding: 8px 7em 8px 30px; text-tran=
sform: uppercase;}
..picker-dropdown-menu {padding-bottom: 6px; width: 234px; z-index: 2108;}
..picker-url-input-frame {cursor: default; overflow: hidden; padding: 2px 10=
px 4px 8px; border-top: 1px solid rgb(229, 229, 229);}
..picker-url-input-text {font-size: 11px; color: rgb(68, 68, 68); margin: 5p=
x 0px 2px;}
..picker-url-input-box {border-width: 1px; border-style: solid; border-color=
: rgb(191, 191, 191) rgb(216, 216, 216) rgb(216, 216, 216); -moz-border-top=
-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: n=
one; -moz-border-left-colors: none; border-image: none; padding: 1px 0px; m=
argin: 1px 0px; font-size: 11px; width: 100%;}
..picker-url-input-box-selected {border: 2px solid rgb(77, 144, 254);}
..picker-urlview {padding: 14px 20px !important;}
..picker-urlview-header {color: rgb(68, 68, 68); font-size: 13px; font-weigh=
t: bold;}
..picker-urlview-input {width: 200px; border-width: 1px; border-style: solid=
; border-color: rgb(191, 191, 191) rgb(216, 216, 216) rgb(216, 216, 216); -=
moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-bo=
ttom-colors: none; -moz-border-left-colors: none; border-image: none; margi=
n: 1px 1px 2px 8px; padding: 3px;}
input.picker-urlview-selected {border: 2px solid rgb(77, 144, 254); margin:=
0px 0px 1px 7px;}
..picker-urlview-loading-icon {background-image: url("//ssl.gstatic.com/docs=
/picker/images/apps_upload_icons-v1.gif") !important; background-position: =
center 0px; height: 16px; width: 16px; margin-left: 5px; margin-bottom: 2px=
; vertical-align: middle; opacity: 0.5;}
..picker-urlview-success-icon {background-image: url("//ssl.gstatic.com/docs=
/picker/images/apps_upload_icons-v1.gif") !important; width: 16px; margin-l=
eft: 5px; vertical-align: middle; opacity: 0.5;}
..picker-urlview-error-icon {background-image: url("//ssl.gstatic.com/docs/p=
icker/images/apps_upload_icons-v1.gif") !important; height: 16px; width: 16=
px; margin-left: 5px; margin-bottom: 2px; vertical-align: middle; opacity: =
0.5;}
..picker-urlview-success-icon {background-position: center -16px; height: 13=
px; margin-bottom: 0px;}
..picker-urlview-error-icon {background-position: center -30px;}
..picker-urlview-preview {position: absolute; margin-top: 8px;}
..picker-urlview-preview-td {vertical-align: middle; text-align: center; col=
or: rgb(170, 170, 170); font-size: 12px;}
..picker-urlview-preview-content {font-size: 14px; margin: 10px 0px;}
..picker-urlview-error-td {color: rgb(204, 51, 51);}
..picker-web-control {border: 6px solid rgb(255, 255, 255); cursor: pointer;=
margin: -2px 8px 4px; overflow: hidden; padding: 6px;}
..picker-web-control-hover ,.picker-web-control-focused {border: 6px solid r=
gb(243, 243, 243); background: rgb(243, 243, 243) none repeat scroll 0% 0%;=
}
..picker-web-control-checked {border: 6px solid rgb(77, 144, 254); backgroun=
d: rgb(242, 247, 255) none repeat scroll 0% 0%;}
..picker-web-control-title {font-size: small; text-decoration: underline;}
..picker-web-control-content {font-size: small; color: rgb(68, 68, 68);}
..picker-web-control-url {font-size: small; color: green;}
..picker-learnmore {position: absolute; bottom: 9px; left: 16px;}
..picker-actionpane-frame .picker-learnmore {float: right; margin-top: 16px;=
position: static;}
..picker-actionpane-frame .picker-learnmore .goog-link-button {margin-right:=
20px; width: auto;}
..picker-learnmore .goog-link-button {width: 134px; vertical-align: middle;}
..picker-spr-questionmark {display: inline-block; margin-right: 5px; vertica=
l-align: middle;}
..picker-iconview-container {height: 100%;}
..picker-iconview-img {border: 1px solid rgb(221, 221, 221); margin-right: a=
uto; margin-left: auto; display: block; position: relative; top: 5%;}
..picker-main-container .jfk-tooltip {z-index: 2103;}
..picker-main-container .jfk-textinput ,.picker-main-container .jfk-button {=
transition: all 0.218s ease 0s;}
..picker-menu-container .goog-menu {z-index: 2112;}
..picker-offscreen {position: absolute; left: -10000px; top: -10000px;}
..picker-content {position: absolute; top: 0px; bottom: 0px; left: 0px; righ=
t: 0px; overflow: hidden;}
..picker-chrome-none .picker-content {left: 0px; right: 0px; bottom: 0px; bo=
rder-top: 0px none; border-left: 0px none; border-right: 0px none;}
..picker-chrome-none .picker-framepane-hidden .picker-actionpane-content .pi=
cker-content {border: 0px none;}
* html .picker-content ,body .picker-content {position: relative; bottom: 0=
px; left: 0px; right: 0px; top: 0px; height: 100%; width: 100%;}
:first-child + html .picker-content {left: 0px; bottom: 0px; right: 0px; to=
p: 0px; overflow-x: hidden;}
:first-child + html .picker-chrome-none .picker-content {left: 0px;}
..picker-dataview {overflow-y: auto;}
..picker-dataview-message {font-size: 13px; padding: 18px 0px 0px 7px; color=
: rgb(51, 51, 51); line-height: 150%;}
..picker-messagelist .picker-dataview-message {margin-left: 13px; padding-to=
p: 5px;}
..picker-combosearchmessagelist .pickercombosearch-content {margin: 20px 0px=
0px 20px;}
..picker-combosearchmessagelist .jfk-button-flat {cursor: pointer; font-size=
: inherit; font-weight: inherit; height: auto;}
..picker-combosearchmessagelist .picker-spr-life-photo-archive-large {margin=
-left: 50px;}
..picker-combosearchmessagelist .picker-searchbar-stock-photos-large {color:=
rgb(102, 102, 102); font-size: 18px; font-weight: bold; height: 27px; marg=
in: 10px 0px 0px 50px; position: absolute; text-align: left; vertical-align=
: middle; width: auto;}
..picker-listrenderer-table {width: 100%; table-layout: fixed; border-spacin=
g: 0px;}
..picker-listrenderer-table .picker-dataview-message {padding: 20px;}
..picker-list-control-tablerow {font-size: 13px; width: 100%; cursor: pointe=
r;}
..picker-list-control-tablerow-with-checkbox {outline: medium none;}
..picker-list-control-focused .jfk-checkbox {border: 1px solid rgb(77, 144, =
254);}
..picker-list-control-unselectable .picker-list-control-cell {color: rgb(204=
, 204, 204);}
..picker-list-control-unselectable .picker-list-control-icon {opacity: 0.3;}
..picker-list-control-checked {background-color: rgb(255, 255, 204);}
..picker-list-control-checkbox-cell {width: 42px; margin: 0px; padding-left:=
20px;}
..picker-list-control-icon-cell {width: 23px; padding-left: 8px;}
..picker-list-control-icon {display: block; margin-top: 4px; padding-bottom:=
3px; width: 16px; height: 16px;}
..picker-list-control-icon-img {max-height: 16px; max-width: 16px;}
..picker-list-control-name-cell {margin-left: 5px; overflow: hidden; padding=
-left: 7px;}
..picker-list-control-lastedited-cell {margin-left: 5px; overflow: hidden; p=
adding-left: 7px; width: 115px;}
..picker-list-control-cell {white-space: nowrap; text-overflow: ellipsis; bo=
rder-bottom: 1px solid rgb(229, 229, 229); padding-top: 4px; padding-bottom=
: 4px;}
..picker-navpane-horizontal-content .picker-list-control-cell {border-color:=
rgb(221, 221, 221);}
..picker-breadcrumbs-frame {cursor: default; overflow: hidden; margin-top: 1=
9px; margin-left: 18px;}
..picker-chrome-none .picker-breadcrumbs-frame {border: 0px none; margin-lef=
t: 0px;}
:first-child + html .picker-breadcrumbs-frame ,* html .picker-breadcrumbs-f=
rame ,body .picker-breadcrumbs-frame {margin-left: 0px; margin-right: 0px;}
* html .picker-breadcrumbs-content ,body .picker-breadcrumbs-content {paddi=
ng-bottom: 6px;}
..picker-breadcrumbs-table {color: rgb(85, 85, 85); font-size: 13px; positio=
n: relative; top: 1px; left: 1px;}
..picker-breadcrumbs-parent {padding-right: 3px; padding-left: 3px; padding-=
bottom: 3px; white-space: nowrap;}
..picker-breadcrumbs-clickable {cursor: pointer;}
..picker-breadcrumbs-triangle {white-space: nowrap;}
..picker-breadcrumbs-triangle1 {border-color: transparent transparent transp=
arent rgb(85, 85, 85); border-style: solid; border-width: 4px; margin: -2px=
2px 3px 6px; width: 0px; height: 0px; vertical-align: middle; line-height:=
0;}
..picker-breadcrumbs-child {font-weight: bold; white-space: nowrap; padding-=
right: 3px; padding-left: 3px; padding-bottom: 3px;}
..picker-butterbar {color: rgb(34, 34, 34); background-color: rgb(249, 237, =
190); font-size: 11px; padding: 3px 0px 0px; height: 17px; text-align: cent=
er; border: 1px solid rgb(240, 195, 109); border-radius: 2px;}
..picker-butterbar .picker-link {color: rgb(0, 0, 0);}
..picker-navhorizontal-new .picker-header-content {border-top: medium none;}
..picker-navhorizontal-new .picker-navpane-horizontal-frame {border-bottom: =
1px solid rgb(225, 225, 225); box-shadow: 0px 1px 5px 1px rgb(225, 225, 225=
); z-index: 1;}
..picker-navpane-horizontal-tab-bar-wrapper {background-color: rgb(245, 245,=
245); height: 50px; text-align: center;}
..picker-navhorizontal-new .picker-navpane-horizontal-tab-bar-wrapper {text-=
align: left;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab-bar {background: trans=
parent none repeat scroll 0% 0%; border-bottom: 0px none; display: inline-b=
lock; font-size: 12px; height: 50px; outline: medium none;}
..picker-navpane-horizontal-tab-bar-wrapper .picker-navpane-horizontal-tabco=
ntent {display: inline-block; font-size: 14px; vertical-align: middle;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab ,.picker-navpane-horiz=
ontal-tab-bar-wrapper .goog-menu-button {background: transparent none repea=
t scroll 0% 0%; border: medium none; color: rgb(34, 34, 34); float: left; h=
eight: 14px; margin: 0px 18px; padding: 16px 4px 7px; position: static;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab-bar-top {border: mediu=
m none !important; padding: 0px !important;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab-hover {background: tra=
nsparent none repeat scroll 0% 0%; border-bottom: 2px solid rgb(77, 144, 25=
4); color: rgb(38, 38, 38); cursor: pointer; padding-bottom: 18px;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-tab-selected {background: =
transparent none repeat scroll 0% 0% !important; border-width: 0px 0px 2px;=
border-style: none none solid; border-color: currentcolor currentcolor rgb=
(77, 144, 254); color: rgb(38, 38, 38); font-weight: bold; padding-bottom: =
18px;}
..picker-navpane-horizontal-tab-bar-wrapper .picker-navpane-horizontal-divid=
er {border-left: 1px solid rgb(34, 34, 34); cursor: default; margin: 10px 1=
0px 0px; padding: 7px 0px;}
..picker-navpane-horizontal-back-icon {display: inline-block; margin-right: =
1px; opacity: 0.8; vertical-align: middle;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-menu-button {font-size: 14=
px; outline: medium none;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-menu-button-hover ,.picker=
-navpane-horizontal-tab-bar-wrapper .goog-menu-button-open {border-bottom: =
2px solid rgb(77, 144, 254); color: rgb(38, 38, 38); cursor: pointer; paddi=
ng-bottom: 17px;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-menu-button.picker-horizon=
tal-navpane-more-selected {border-bottom: 2px solid rgb(77, 144, 254); colo=
r: rgb(38, 38, 38); cursor: pointer; font-weight: bold; padding-bottom: 17p=
x;}
..picker-navpane-horizontal-tab-bar-wrapper .goog-menu-button .picker-spr-ar=
row-dk-grey-down {opacity: 0.5; display: inline-block; margin: 0px 0px 2px =
5px;}
..picker-horizontal-navpane-more-menu {max-height: 50%; overflow-y: auto; z-=
index: 2200;}
..picker-navpane-horizontal-tab-bar-wrapper .picker-navpane-horizontal-paren=
t-tab {padding: 15px 2px 0px;}
..picker-navpane-horizontal-parent-tab.goog-tab-hover {padding-bottom: 19px;=
}
..picker-navpane-frame {background-color: rgb(255, 255, 255); border-right: =
1px solid rgb(229, 229, 229); overflow: visible; padding: 14px 0px 0px; z-i=
ndex: 2102;}
..picker-peoplesearchbar-showroom.picker-navpane-frame {background-color: rg=
b(245, 245, 245); border-right: 1px solid rgb(245, 245, 245);}
..picker-navpane-content {overflow: hidden; right: 0px;}
..picker-chrome-inline .picker-navpane-content {top: 10px;}
..picker-main-container .picker-navpane-frame .goog-tree-icon {width: 0px;}
..picker-main-container .picker-navpane-frame .picker-spr-arrow-dk-grey {cur=
sor: pointer; height: 7px; margin-bottom: 1px; margin-left: 2px; margin-rig=
ht: 6px; width: 4px;}
..picker-main-container .picker-navpane-frame .picker-spr-arrow-dk-grey-down=
{cursor: pointer; height: 4px; margin-right: 5px; width: 7px;}
..picker-main-container .picker-navpane-frame .picker-navpane-hascollapse .g=
oog-tree-expand-icon-blank {width: 12px;}
..picker-main-container .picker-navpaneitem .goog-tree-row .goog-tree-icon {=
left: 11px; position: relative;}
..picker-main-container .picker-navpane-frame .goog-tree-root.goog-tree-item=
{margin-top: -1px; outline: medium none; overflow: auto; padding: 2px 12px=
0px 0px;}
..picker-main-container .picker-navpaneitem .goog-tree-item-label {color: rg=
b(68, 68, 68); cursor: pointer; font-size: 13px; margin: 0px 20px 0px 0px; =
overflow: visible; white-space: normal; width: auto; z-index: 2103;}
..picker-main-container .goog-tree-item .picker-navpaneitem .selected {backg=
round-color: transparent; font-weight: normal;}
..picker-main-container .picker-navpane-frame .goog-tree-item .goog-tree-row=
{border-left: 5px solid transparent;}
..picker-main-container .picker-navpane-frame .goog-tree-root .picker-navpan=
eitem-active {border-left: 5px solid rgb(221, 75, 57); border-radius: 0px;}
..picker-main-container .picker-navpaneitem .goog-tree-item-label {margin-le=
ft: 11px;}
..picker-main-container .goog-tree-root .picker-navpaneitem-active .goog-tre=
e-item-label {color: rgb(207, 66, 54); font-weight: bold;}
..picker-main-container .picker-navpaneitem .goog-tree-row {height: auto; li=
ne-height: 90%; margin: 0px; padding: 3px 0px 6px; white-space: nowrap;}
..picker-main-container .picker-navpanedivider .goog-tree-row {line-height: =
0; margin: 0px 10px; padding: 10px 0px; white-space: nowrap;}
..picker-main-container .picker-navpane-frame .picker-navpanedivider .goog-t=
ree-expand-icon-blank ,.picker-main-container .picker-navpanedivider .picke=
r-navpanedivider-icon {height: 0px; position: absolute;}
..picker-main-container .picker-navpanedivider .picker-nav-hr {background-co=
lor: rgb(235, 235, 235); border-width: 0px; color: rgb(235, 235, 235); heig=
ht: 1px;}
..picker-main-container .goog-tree-item .picker-navpaneitem .picker-navpanei=
tem-root {margin-bottom: 1px; padding: 6px 0px 9px;}
..picker-main-container .goog-tree-item .picker-navpaneitem .picker-navpanei=
tem-hover ,.picker-main-container .focused .picker-navpaneitem .selected {b=
ackground-color: rgb(238, 238, 238);}
..picker-main-container .picker-navpane-frame .goog-tree-root .picker-navpan=
eitem .picker-navpaneitem-not-clickable {cursor: default;}
:first-child + html .picker-main-container .picker-navpane-frame .goog-tree=
-root .picker-navpaneitem .goog-tree-item-label {margin-right: 0px; padding=
-bottom: 4px;}
:first-child + html .picker-main-container .picker-navpaneitem .goog-tree-r=
ow {padding-bottom: 0px;}
:first-child + html .picker-main-container .goog-tree-item .picker-navpanei=
tem .picker-navpaneitem-root {padding-bottom: 5px;}
..picker-navpane-frame .picker-buildlabel {bottom: 0px; color: rgb(153, 153,=
153); font-size: 10px; left: 0px; padding: 5px; position: absolute;}
..picker-navpane-frame .picker-buildlabel-a {color: rgb(153, 153, 153);}
..picker-noticebar {font-size: 12px; padding: 7px 14px 15px; color: rgb(68, =
68, 68);}
..picker-progress-bar-spinner.progress-bar-horizontal {border: 0px none; bac=
kground: transparent url("//ssl.gstatic.com/docs/picker/images/loading-v1.g=
if") no-repeat scroll 0px 0px; height: 16px; width: 16px; margin: auto auto=
5px; opacity: 0.5;}
..picker-progress-bar-spinner .progress-bar-thumb {opacity: 0;}
..picker-progress-bar.progress-bar-horizontal {position: relative; border: 0=
px none; text-align: left; background: rgb(225, 225, 225) none repeat scrol=
l 0% 0%; vertical-align: top;}
..picker-main-container .progress-bar-thumb {transition: width 1s ease 0s;}
..picker-progress-bar .progress-bar-thumb {background: rgb(44, 117, 236) non=
e repeat scroll 0% 0%; height: 16px;}
..picker-jfk-tall-progressbar {border-width: 1px; border-style: solid; paddi=
ng: 1px;}
..picker-jfk-tall-progressbar .progress-bar-thumb {height: 8px;}
..picker-sspr-back-arrow-black {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -129=
px; height: 21px; width: 21px;}
..picker-sspr-back-arrow-inverted {background: rgba(0, 0, 0, 0) url("//ssl.g=
static.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -=
562px; height: 21px; width: 21px;}
..picker-sspr-close-tab {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -150px; hei=
ght: 15px; width: 15px;}
..picker-sspr-drive-logo-black {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -61p=
x; height: 20px; width: 20px;}
..picker-sspr-folder-new {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -349px; he=
ight: 21px; width: 21px;}
..picker-sspr-forward-arrow-black {background: rgba(0, 0, 0, 0) url("//ssl.g=
static.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -=
436px; height: 21px; width: 21px;}
..picker-sspr-forward-arrow-inverted {background: rgba(0, 0, 0, 0) url("//ss=
l.gstatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0p=
x -394px; height: 21px; width: 21px;}
..picker-sspr-group {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/doc=
s/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -481px; height:=
24px; width: 24px;}
..picker-sspr-group-white {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.c=
om/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -601px; h=
eight: 24px; width: 24px;}
..picker-sspr-help-black {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -165px; he=
ight: 24px; width: 24px;}
..picker-sspr-help-white {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -538px; he=
ight: 24px; width: 24px;}
..picker-sspr-inline-image {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -517px; =
height: 21px; width: 21px;}
..picker-sspr-launch {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/do=
cs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -625px; height=
: 18px; width: 18px;}
..picker-sspr-launch-inverted {background: rgba(0, 0, 0, 0) url("//ssl.gstat=
ic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -583p=
x; height: 18px; width: 18px;}
..picker-sspr-minpicker-back-button {background: rgba(0, 0, 0, 0) url("//ssl=
..gstatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px=
-21px; height: 16px; width: 16px;}
..picker-sspr-minpicker-forward-button {background: rgba(0, 0, 0, 0) url("//=
ssl.gstatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll =
0px -309px; height: 16px; width: 16px;}
..picker-sspr-my-drive-new-black {background: rgba(0, 0, 0, 0) url("//ssl.gs=
tatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -4=
57px; height: 24px; width: 24px;}
..picker-sspr-my-drive-new-white {background: rgba(0, 0, 0, 0) url("//ssl.gs=
tatic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -2=
37px; height: 24px; width: 24px;}
..picker-sspr-mydrive {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/d=
ocs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -370px; heigh=
t: 24px; width: 24px;}
..picker-sspr-mydrive-white {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -261px;=
height: 24px; width: 24px;}
..picker-sspr-open-link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -505px; hei=
ght: 12px; width: 12px;}
..picker-sspr-paper-clip {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -415px; he=
ight: 21px; width: 21px;}
..picker-sspr-plus {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/docs=
/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -37px; height: 2=
4px; width: 24px;}
..picker-sspr-plus-inverted {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -213px;=
height: 24px; width: 24px;}
..picker-sspr-search-icon {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.c=
om/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px 0px; heig=
ht: 21px; width: 21px;}
..picker-sspr-sort {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/docs=
/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -325px; height: =
24px; width: 24px;}
..picker-sspr-starred {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/d=
ocs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -81px; height=
: 24px; width: 24px;}
..picker-sspr-starred-white {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -285px;=
height: 24px; width: 24px;}
..picker-sspr-team-drive-black {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -105=
px; height: 24px; width: 24px;}
..picker-sspr-team-drive-white {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/docs/picker/images/onepick_sprite12.svg") no-repeat scroll 0px -189=
px; height: 24px; width: 24px;}
..picker-spr-add-people ,.picker-spr-added-check ,.picker-spr-arrow-back ,.p=
icker-spr-arrow-back-white ,.picker-spr-arrow-dk-grey ,.picker-spr-arrow-dk=
-grey-down ,.picker-spr-arrow-forward ,.picker-spr-arrow-forward-white ,.pi=
cker-spr-audience-acl-small-domain-public ,.picker-spr-audience-acl-small-e=
xtended-circles ,.picker-spr-audience-acl-small-limited ,.picker-spr-audien=
ce-acl-small-owner-only ,.picker-spr-audience-acl-small-public ,.picker-spr=
-back-folder-ltr ,.picker-spr-back-folder-rtl ,.picker-spr-black-close ,.pi=
cker-spr-check ,.picker-spr-checkbox-active ,.picker-spr-checkbox-selected =
,.picker-spr-checkbox-selected-blue ,.picker-spr-checkmark-checked ,.picker=
-spr-circle ,.picker-spr-circle-active ,.picker-spr-circle-big ,.picker-spr=
-circle-big-white ,.picker-spr-circle-hover ,.picker-spr-close-box-small-of=
f ,.picker-spr-close-box-small-on ,.picker-spr-close-box-tiny-black ,.picke=
r-spr-close-box-tiny-white ,.picker-spr-close-min ,.picker-spr-collection ,=
..picker-spr-drive-64 ,.picker-spr-drive-black-icon ,.picker-spr-drive-drag-=
upload-icon ,.picker-spr-drive-upload-icon ,.picker-spr-folder-shared-white=
,.picker-spr-folder-white ,.picker-spr-gmail ,.picker-spr-google-logo ,.pi=
cker-spr-google-logo-large ,.picker-spr-google-photos-20 ,.picker-spr-googl=
e-photos-24 ,.picker-spr-googleplus ,.picker-spr-grid-view ,.picker-spr-ic-=
dragfile-blue ,.picker-spr-ic-dragfile-bluepng ,.picker-spr-ic-dragfile-gre=
y ,.picker-spr-ic-dragphoto-blue ,.picker-spr-ic-dragphoto-grey ,.picker-sp=
r-ic-dragvideo-blue ,.picker-spr-ic-dragvideo-grey ,.picker-spr-ic-photos-1=
2 ,.picker-spr-ic-photos-20 ,.picker-spr-ic-remove ,.picker-spr-icon-autofi=
x-active ,.picker-spr-icon-computer ,.picker-spr-icon-cover-photo ,.picker-=
spr-icon-photos-delete ,.picker-spr-icon-photos-delete-white ,.picker-spr-i=
con-remove-active ,.picker-spr-icon-rotate-ccw-active ,.picker-spr-icon-rot=
ate-cw-active ,.picker-spr-icon-rotate-left-white ,.picker-spr-icon-rotate-=
right-white ,.picker-spr-icon-three-dots-active ,.picker-spr-icon-zoom-max =
,.picker-spr-icon-zoom-min ,.picker-spr-imagefilter-all-colors ,.picker-spr=
-imagefilter-monochrome ,.picker-spr-inline-image ,.picker-spr-large-plus-b=
lack ,.picker-spr-life-photo-archive ,.picker-spr-life-photo-archive-large =
,.picker-spr-list-view ,.picker-spr-maps-cancel-en ,.picker-spr-maps-next-d=
is ,.picker-spr-maps-next-en ,.picker-spr-maps-prev-dis ,.picker-spr-maps-p=
rev-en ,.picker-spr-mic ,.picker-spr-navpane-albums ,.picker-spr-navpane-al=
bums-selected ,.picker-spr-navpane-from-computer ,.picker-spr-navpane-from-=
computer-selected ,.picker-spr-navpane-gdrive ,.picker-spr-navpane-gdrive-s=
elected ,.picker-spr-navpane-instantupload ,.picker-spr-navpane-instantuplo=
ad-selected ,.picker-spr-navpane-url ,.picker-spr-navpane-webcam ,.picker-s=
pr-navpane-webcam-selected ,.picker-spr-navpane-youtube ,.picker-spr-new-fo=
lder ,.picker-spr-no-photo ,.picker-spr-no-photo-48 ,.picker-spr-no-photo-8=
4 ,.picker-spr-paper-clip ,.picker-spr-photo-discard ,.picker-spr-photo-ico=
n ,.picker-spr-photo-upload-cancel ,.picker-spr-picasa-rectangles ,.picker-=
spr-plus-black ,.picker-spr-plus-gray ,.picker-spr-profile-rotate-ccw ,.pic=
ker-spr-profile-rotate-cw ,.picker-spr-questionmark ,.picker-spr-rio-arrow-=
menu ,.picker-spr-rio-check-active ,.picker-spr-rio-check-checked ,.picker-=
spr-rio-checkmark-active ,.picker-spr-rio-checkmark-selected ,.picker-spr-r=
io-rotate ,.picker-spr-rio-trash ,.picker-spr-rio-upload ,.picker-spr-rio-u=
pload-big ,.picker-spr-sad-face ,.picker-spr-sort ,.picker-spr-sort-bar ,.p=
icker-spr-toolbar-gray-rotate-ccw ,.picker-spr-toolbar-gray-rotate-cw ,.pic=
ker-spr-toolbar-gray-trash ,.picker-spr-toolbar-white-rotate-ccw ,.picker-s=
pr-toolbar-white-rotate-cw ,.picker-spr-toolbar-white-trash ,.picker-spr-up=
load-arrow ,.picker-spr-upload-error ,.picker-spr-upload-retry ,.picker-spr=
-video-play-overlay ,.picker-spr-video-play-overlay-small ,.picker-spr-vide=
o-stars ,.picker-spr-video-stars-rtl ,.picker-spr-video-upload-icon ,.picke=
r-spr-white-checkmark ,.picker-spr-youtube {background: rgba(0, 0, 0, 0) ur=
l("//ssl.gstatic.com/docs/picker/images/picker_sprite-v107.png") no-repeat =
scroll 0% 0%;}
..picker-spr-add-people {background-position: -28px -230px; width: 27px; hei=
ght: 26px;}
..picker-spr-added-check {background-position: 0px -676px; width: 21px; heig=
ht: 21px;}
..picker-spr-arrow-back-white {background-position: -128px -1112px; width: 2=
1px; height: 21px;}
..picker-spr-arrow-back {background-position: -15px -1402px; width: 21px; he=
ight: 21px;}
..picker-spr-arrow-dk-grey-down {background-position: 0px -1240px; width: 7p=
x; height: 4px;}
..picker-spr-arrow-dk-grey {background-position: 0px -230px; width: 4px; hei=
ght: 7px;}
..picker-spr-arrow-forward-white {background-position: 0px -576px; width: 21=
px; height: 21px;}
..picker-spr-arrow-forward {background-position: -58px -676px; width: 21px; =
height: 21px;}
..picker-spr-audience-acl-small-domain-public {background-position: -110px -=
1402px; width: 12px; height: 12px;}
..picker-spr-audience-acl-small-extended-circles {background-position: -88px=
-1388px; width: 12px; height: 12px;}
..picker-spr-audience-acl-small-limited {background-position: -4px -310px; w=
idth: 12px; height: 12px;}
..picker-spr-audience-acl-small-owner-only {background-position: 0px -1112px=
; width: 12px; height: 12px;}
..picker-spr-audience-acl-small-public {background-position: 0px -985px; wid=
th: 12px; height: 12px;}
..picker-spr-back-folder-ltr {background-position: 0px -1012px; width: 21px;=
height: 21px;}
..picker-spr-back-folder-rtl {background-position: 0px -1304px; width: 21px;=
height: 21px;}
..picker-spr-black-close {background-position: -147px -244px; width: 11px; h=
eight: 11px;}
..picker-spr-checkbox-active {background-position: -15px -1140px; width: 24p=
x; height: 24px;}
..picker-spr-checkbox-selected-blue {background-position: 0px -1325px; width=
: 24px; height: 24px;}
..picker-spr-checkbox-selected {background-position: -46px -802px; width: 24=
px; height: 24px;}
..picker-spr-checkmark-checked {background-position: -19px -922px; width: 18=
px; height: 18px;}
..picker-spr-check {background-position: 0px -890px; width: 14px; height: 11=
px;}
..picker-spr-circle-active {background-position: 0px -1373px; width: 14px; h=
eight: 14px;}
..picker-spr-circle-big-white {background-position: -79px -676px; width: 26p=
x; height: 26px;}
..picker-spr-circle-big {background-position: -83px -1112px; width: 26px; he=
ight: 26px;}
..picker-spr-circle-hover {background-position: -147px -230px; width: 14px; =
height: 14px;}
..picker-spr-circle {background-position: -113px -64px; width: 14px; height:=
14px;}
..picker-spr-close-box-small-off {background-position: -79px -945px; width: =
15px; height: 15px;}
..picker-spr-close-box-small-on {background-position: -43px -676px; width: 1=
5px; height: 15px;}
..picker-spr-close-box-tiny-black {background-position: -19px -915px; width:=
7px; height: 7px;}
..picker-spr-close-box-tiny-white {background-position: -82px -985px; width:=
7px; height: 7px;}
..picker-spr-close-min {background-position: -105px -676px; width: 11px; hei=
ght: 11px;}
..picker-spr-collection {background-position: -21px -1077px; width: 16px; he=
ight: 13px;}
..picker-spr-drive-64 {background-position: -88px -1511px; width: 64px; heig=
ht: 64px;}
..picker-spr-drive-black-icon {background-position: -79px -960px; width: 21p=
x; height: 21px;}
..picker-spr-drive-drag-upload-icon {background-position: 0px -422px; width:=
35px; height: 45px;}
..picker-spr-drive-upload-icon {background-position: -149px -1112px; width: =
11px; height: 14px;}
..picker-spr-folder-shared-white {background-position: -4px -289px; width: 2=
1px; height: 21px;}
..picker-spr-folder-white {background-position: -32px -363px; width: 21px; h=
eight: 21px;}
..picker-spr-gmail {background-position: -72px -1388px; width: 16px; height:=
11px;}
..picker-spr-google-logo-large {background-position: -40px -826px; width: 11=
8px; height: 41px;}
..picker-spr-google-logo {background-position: -64px -915px; width: 61px; he=
ight: 28px;}
..picker-spr-google-photos-20 {background-position: -90px -802px; width: 20p=
x; height: 20px;}
..picker-spr-google-photos-24 {background-position: -4px -230px; width: 24px=
; height: 24px;}
..picker-spr-googleplus {background-position: -109px -390px; width: 48px; he=
ight: 48px;}
..picker-spr-grid-view {background-position: 0px -1140px; width: 15px; heigh=
t: 15px;}
..picker-spr-ic-dragfile-bluepng {background-position: 0px -130px; width: 10=
0px; height: 100px;}
..picker-spr-ic-dragfile-blue {background-position: -100px -130px; width: 64=
px; height: 64px;}
..picker-spr-ic-dragfile-grey {background-position: 0px -1447px; width: 64px=
; height: 64px;}
..picker-spr-ic-dragphoto-blue {background-position: -65px -278px; width: 64=
px; height: 64px;}
..picker-spr-ic-dragphoto-grey {background-position: -90px -1240px; width: 6=
4px; height: 64px;}
..picker-spr-ic-dragvideo-blue {background-position: 0px -1511px; width: 64p=
x; height: 64px;}
..picker-spr-ic-dragvideo-grey {background-position: 0px -702px; width: 100p=
x; height: 100px;}
..picker-spr-ic-photos-12 {background-position: -125px -915px; width: 12px; =
height: 12px;}
..picker-spr-ic-photos-20 {background-position: -70px -802px; width: 20px; h=
eight: 20px;}
..picker-spr-ic-remove {background-position: -24px -826px; width: 16px; heig=
ht: 16px;}
..picker-spr-icon-autofix-active {background-position: 0px -802px; width: 24=
px; height: 24px;}
..picker-spr-icon-computer {background-position: -21px -676px; width: 22px; =
height: 20px;}
..picker-spr-icon-cover-photo {background-position: -124px -702px; width: 14=
px; height: 21px;}
..picker-spr-icon-photos-delete-white {background-position: 0px -826px; widt=
h: 24px; height: 24px;}
..picker-spr-icon-photos-delete {background-position: -100px -702px; width: =
24px; height: 24px;}
..picker-spr-icon-remove-active {background-position: -100px -726px; width: =
24px; height: 24px;}
..picker-spr-icon-rotate-ccw-active {background-position: 0px 0px; width: 24=
px; height: 24px;}
..picker-spr-icon-rotate-cw-active {background-position: -64px -1511px; widt=
h: 24px; height: 24px;}
..picker-spr-icon-rotate-left-white {background-position: -43px -936px; widt=
h: 15px; height: 9px;}
..picker-spr-icon-rotate-right-white {background-position: 0px -1402px; widt=
h: 15px; height: 9px;}
..picker-spr-icon-three-dots-active {background-position: -104px 0px; width:=
24px; height: 24px;}
..picker-spr-icon-zoom-max {background-position: 0px -390px; width: 32px; he=
ight: 32px;}
..picker-spr-icon-zoom-min {background-position: 0px -342px; width: 32px; he=
ight: 32px;}
..picker-spr-imagefilter-all-colors {background-position: -21px -1304px; wid=
th: 19px; height: 19px;}
..picker-spr-imagefilter-monochrome {background-position: -109px -1112px; wi=
dth: 19px; height: 19px;}
..picker-spr-inline-image {background-position: -43px -915px; width: 21px; h=
eight: 21px;}
..picker-spr-large-plus-black {background-position: -87px -230px; width: 12p=
x; height: 12px;}
..picker-spr-life-photo-archive-large {background-position: 0px -945px; widt=
h: 79px; height: 40px;}
..picker-spr-life-photo-archive {background-position: -12px -1112px; width: =
55px; height: 28px;}
..picker-spr-list-view {background-position: -55px -262px; width: 15px; heig=
ht: 15px;}
..picker-spr-maps-cancel-en {background-position: 0px -883px; width: 7px; he=
ight: 7px;}
..picker-spr-maps-next-dis {background-position: -128px -867px; width: 6px; =
height: 11px;}
..picker-spr-maps-next-en {background-position: -37px -915px; width: 6px; he=
ight: 11px;}
..picker-spr-maps-prev-dis {background-position: -24px -32px; width: 6px; he=
ight: 11px;}
..picker-spr-maps-prev-en {background-position: -76px -985px; width: 6px; he=
ight: 11px;}
..picker-spr-mic {background-position: 0px -1349px; width: 9px; height: 14px=
;}
..picker-spr-navpane-albums-selected {background-position: -99px -230px; wid=
th: 48px; height: 48px;}
..picker-spr-navpane-albums {background-position: -100px -750px; width: 48px=
; height: 48px;}
..picker-spr-navpane-from-computer-selected {background-position: -109px -43=
8px; width: 30px; height: 28px;}
..picker-spr-navpane-from-computer {background-position: -21px -1049px; widt=
h: 30px; height: 28px;}
..picker-spr-navpane-gdrive-selected {background-position: -24px -1325px; wi=
dth: 48px; height: 48px;}
..picker-spr-navpane-gdrive {background-position: 0px -508px; width: 48px; h=
eight: 48px;}
..picker-spr-navpane-instantupload-selected {background-position: -56px 0px;=
width: 48px; height: 48px;}
..picker-spr-navpane-instantupload {background-position: -53px -342px; width=
: 48px; height: 48px;}
..picker-spr-navpane-url {background-position: -83px -64px; width: 30px; hei=
ght: 30px;}
..picker-spr-navpane-webcam-selected {background-position: 0px -1244px; widt=
h: 48px; height: 48px;}
..picker-spr-navpane-webcam {background-position: -101px -342px; width: 48px=
; height: 48px;}
..picker-spr-navpane-youtube {background-position: -21px -576px; width: 30px=
; height: 30px;}
..picker-spr-new-folder {background-position: -48px -1240px; width: 21px; he=
ight: 21px;}
..picker-spr-no-photo-48 {background-position: -80px -867px; width: 48px; he=
ight: 48px;}
..picker-spr-no-photo-84 {background-position: -72px -1304px; width: 84px; h=
eight: 84px;}
..picker-spr-no-photo {background-position: 0px -476px; width: 32px; height:=
32px;}
..picker-spr-paper-clip {background-position: -69px -1240px; width: 21px; he=
ight: 21px;}
..picker-spr-photo-discard {background-position: -41px -278px; width: 24px; =
height: 24px;}
..picker-spr-photo-icon {background-position: -105px -687px; width: 18px; he=
ight: 14px;}
..picker-spr-photo-upload-cancel {background-position: -41px -302px; width: =
10px; height: 10px;}
..picker-spr-picasa-rectangles {background-position: -19px -867px; width: 61=
px; height: 44px;}
..picker-spr-plus-black {background-position: -32px -342px; width: 21px; hei=
ght: 21px;}
..picker-spr-plus-gray {background-position: -148px -278px; width: 9px; heig=
ht: 9px;}
..picker-spr-profile-rotate-ccw {background-position: 0px -867px; width: 19p=
x; height: 16px;}
..picker-spr-profile-rotate-cw {background-position: -64px -1535px; width: 1=
9px; height: 16px;}
..picker-spr-questionmark {background-position: -123px -676px; width: 16px; =
height: 16px;}
..picker-spr-rio-arrow-menu {background-position: -83px -48px; width: 16px; =
height: 16px;}
..picker-spr-rio-check-active {background-position: -55px -230px; width: 32p=
x; height: 32px;}
..picker-spr-rio-check-checked {background-position: -24px 0px; width: 32px;=
height: 32px;}
..picker-spr-rio-checkmark-active {background-position: -137px -867px; width=
: 24px; height: 24px;}
..picker-spr-rio-checkmark-selected {background-position: -139px -676px; wid=
th: 24px; height: 24px;}
..picker-spr-rio-rotate {background-position: -25px -278px; width: 16px; hei=
ght: 16px;}
..picker-spr-rio-trash {background-position: -67px -1112px; width: 16px; hei=
ght: 16px;}
..picker-spr-rio-upload-big {background-position: -35px -390px; width: 74px;=
height: 86px;}
..picker-spr-rio-upload {background-position: -128px 0px; width: 25px; heigh=
t: 29px;}
..picker-spr-sad-face {background-position: -16px -48px; width: 67px; height=
: 58px;}
..picker-spr-sort-bar {background-position: -55px -1402px; width: 20px; heig=
ht: 20px;}
..picker-spr-sort {background-position: -139px -438px; width: 13px; height: =
18px;}
..picker-spr-toolbar-gray-rotate-ccw {background-position: -94px -945px; wid=
th: 19px; height: 14px;}
..picker-spr-toolbar-gray-rotate-cw {background-position: -36px -1402px; wid=
th: 19px; height: 14px;}
..picker-spr-toolbar-gray-trash {background-position: -75px -1402px; width: =
19px; height: 14px;}
..picker-spr-toolbar-white-rotate-ccw {background-position: -129px -278px; w=
idth: 19px; height: 14px;}
..picker-spr-toolbar-white-rotate-cw {background-position: 0px -915px; width=
: 19px; height: 14px;}
..picker-spr-toolbar-white-trash {background-position: 0px -850px; width: 19=
px; height: 14px;}
..picker-spr-upload-arrow {background-position: -4px -278px; width: 11px; he=
ight: 11px;}
..picker-spr-upload-error {background-position: 0px -48px; width: 16px; heig=
ht: 14px;}
..picker-spr-upload-retry {background-position: -100px -1388px; width: 14px;=
height: 14px;}
..picker-spr-video-play-overlay-small {background-position: -24px -802px; wi=
dth: 22px; height: 22px;}
..picker-spr-video-play-overlay {background-position: -21px -1012px; width: =
37px; height: 37px;}
..picker-spr-video-stars-rtl {background-position: 0px -106px; width: 110px;=
height: 24px;}
..picker-spr-video-stars {background-position: 0px -1423px; width: 110px; he=
ight: 24px;}
..picker-spr-video-upload-icon {background-position: -82px -992px; width: 22=
px; height: 14px;}
..picker-spr-white-checkmark {background-position: -64px -1551px; width: 12p=
x; height: 9px;}
..picker-spr-youtube {background-position: -12px -985px; width: 64px; height=
: 27px;}
..picker-searchbar {margin: 15px 0px 8px 20px;}
..picker-searchbar .jfk-button {background-image: none; vertical-align: midd=
le;}
..picker-searchbar .goog-menu {z-index: 2112;}
..picker-searchbar-input {font-size: 13px; text-align: left;}
..picker-searchbar-input-logo .picker-spr-google-logo {margin-right: 10px;}
..picker-searchbar .picker-searchbar-input-logo {position: relative;}
..picker-searchbar .picker-flat-menu-button {cursor: pointer; height: 14px; =
left: 221px; min-width: 0px; opacity: 0.5; padding: 11px 15px 0px 5px; posi=
tion: absolute; top: 6px;}
..picker-searchbar .picker-flat-menu-button.jfk-button-hover ,.picker-search=
bar .picker-flat-menu-button.jfk-button-focused {opacity: 1;}
..picker-searchbar-input-box.picker-searchbar-dropdownmenu-padding {width: 2=
10px; padding-right: 23px;}
..picker-searchbar .picker-flat-menu-button .picker-spr-arrow-dk-grey-down {=
position: absolute;}
..picker-searchbar-input-logo .picker-spr-life-photo-archive {margin: 0px 6p=
x 0px 2px;}
..picker-searchbar-input-item {vertical-align: bottom;}
..picker-searchbar-input-box {width: 225px; margin: 4px 15px 5px 0px; vertic=
al-align: middle;}
..picker-searchbar-logo .picker-searchbar-input-box {margin-top: 5px;}
..picker-searchbar-input-logo .picker-searchbar-stock-photos ,.goog-menuitem=
-content .picker-searchbar-stock-photos {text-align: left; color: rgb(102, =
102, 102); padding: 6px 4px 0px 0px; margin: 0px; width: auto; height: 22px=
; vertical-align: middle; font-size: 15px; font-weight: bold;}
..picker-searchbar-input-logo .goog-flat-menu-button-caption .picker-spr-goo=
gle-logo {margin: 2px 2px 2px 0px;}
..picker-searchbar-input-logo .goog-flat-menu-button-caption .picker-spr-lif=
e-photo-archive {margin: 2px 6px 2px 2px;}
..picker-searchbar-input-logo .goog-flat-menu-button-caption .picker-searchb=
ar-stock-photos {padding: 2px 0px 0px; height: 30px;}
..goog-menuitem.picker-searchbar-menuitem {padding-right: 13px; padding-left=
: 13px;}
..picker-searchbar-menuitem .goog-menuitem-content {margin-top: -2px;}
..picker-searchbar-input-logo .goog-flat-menu-button.picker-searchbar-combob=
ox-dropdown {border-bottom-right-radius: 0px; border-top-right-radius: 0px;=
height: 32px; margin: 0px; vertical-align: middle;}
..picker-searchbar-input-logo .goog-flat-menu-button.picker-searchbar-combob=
ox-dropdown.goog-flat-menu-button-focused {z-index: 2104;}
..picker-searchbar-combobox .picker-searchbar-input-box {padding-top: 4px; p=
adding-bottom: 3px; margin-left: -1px; position: relative; z-index: 2103;}
..picker-searchbar-combobox .jfk-button {height: 28px; padding-top: 4px;}
..picker-drive-view-switcher {display: inline-block; position: absolute; rig=
ht: 20px; top: 19px;}
..picker-drive-view-switcher-with-drive-sort {right: 58px;}
..picker-drive-view-switcher-button {opacity: 0.55; margin: 6px 12px;}
..picker-doctype-chip {background-color: rgb(218, 228, 246); border: 1px sol=
id rgb(218, 228, 246); border-radius: 2px; display: inline-block; height: 2=
3px; left: 22px; outline: medium none; position: absolute; top: 6px;}
..picker-videos-listview .picker-doctype-chip ,.picker-videos-grid .picker-d=
octype-chip {left: 2px;}
..picker-doctype-chip-label {display: inline-block; font-size: 12px; line-he=
ight: 23px; padding: 0px 3px; vertical-align: top;}
..picker-doctype-chip-dismiss {display: inline-block; padding: 8px 4px;}
..picker-dropdown-menu.picker-doctypes-dropdown-menu {max-height: 70%; width=
: 341px;}
..picker-navhorizontal-new .picker-dropdown-menu.picker-doctypes-dropdown-me=
nu {width: 441px;}
..picker-doctypes-dropdown-menu .picker-dropdown-menuitem-header {padding-bo=
ttom: 0px;}
..picker-dataview .picker-searchbar-input {position: relative;}
..picker-main-container .picker-dataview .picker-searchbar .picker-flat-menu=
-button {left: 321px;}
..picker-dataview .picker-searchbar-input-box.picker-searchbar-dropdownmenu-=
padding {width: 310px;}
..picker-dataview .picker-searchbar-input-box {width: 325px;}
..picker-bloggerinstructions-text {color: rgb(68, 68, 68); font-size: 11px; =
padding: 10px 15px 2px;}
..picker-docsortoptions-menu-button {display: inline-block; min-width: 22px;=
padding-right: 8px; position: absolute; right: 34px; top: 19px;}
..picker-docsortoptions-menu-button .goog-flat-menu-button-dropdown {display=
: none;}
..picker-docsortoptions-menu-button-content {height: 18px; margin: 4px 3px; =
opacity: 0.5;}
..picker-docsortoptions-selector {border-bottom: 1px solid rgb(229, 229, 229=
); padding-bottom: 4px; padding-top: 8px; position: relative;}
..picker-docsortoptions-title {color: rgb(170, 170, 170); cursor: pointer; d=
isplay: inline-block; font-size: 11px; font-weight: bold; margin-left: 70px=
; text-transform: uppercase; vertical-align: top;}
..picker-docsortoptions-label {color: rgb(170, 170, 170); display: inline-bl=
ock; font-size: 11px; font-weight: bold; position: absolute; right: 40px; t=
ext-transform: uppercase; vertical-align: top;}
..picker-docsortoptions-active.picker-docsortoptions-title ,.picker-docsorto=
ptions-active.picker-docsortoptions-label {color: rgb(221, 75, 57);}
..picker-docsortoptions-button {display: inline-block; position: absolute; r=
ight: 20px; vertical-align: top;}
..picker-docsortoptions-grid-view .picker-docsortoptions-label {display: inl=
ine-block; margin-left: 40px; position: static;}
..picker-docsortoptions-grid-view .picker-docsortoptions-button {display: in=
line-block; margin-left: 6px; position: static;}
..picker-dropdown-menu.picker-sort-dropdown-menu {max-width: 30%; width: ini=
tial;}
..picker-sort-dropdown-menu .goog-menuitem {min-width: 0px; padding-left: 20=
px;}
..picker-sort-dropdown-menu .goog-menuitem-content {overflow: hidden; text-o=
verflow: ellipsis;}
..picker-promo-table {position: absolute; top: 0px; left: 0px; height: 100%;=
width: 100%; border-spacing: 15px; margin-top: -15px;}
..picker-promo-logo {margin: 15px;}
..picker-promo-text {font-size: 13px; color: rgb(170, 170, 170); width: 420p=
x;}
..picker-promo-title {font-size: 13px; color: rgb(0, 0, 0); font-weight: bol=
d; margin-bottom: 10px; width: 420px;}
..picker-uploadbar {color: rgb(68, 68, 68); font-size: 11px; margin-bottom: =
15px; white-space: nowrap;}
..picker-uploadbar .jfk-button {margin: 15px 15px 5px;}
..picker-uploadbar .picker-spr-upload-arrow {margin-right: 6px;}
..picker-uploadbar-msg {padding: 4px 15px;}
..picker-uploadbar-separator {margin-top: 7px; border-top: 1px solid rgb(221=
, 221, 221);}
..picker-uploadbar-htmlfileinput {margin: 14px 14px 3px;}
..picker-main-container {position: absolute; height: 100%; width: 100%;}
..picker-modal-dialog {box-shadow: 0px 4px 16px rgba(0, 0, 0, 0.2); -moz-use=
r-select: none; background: rgb(255, 255, 255) none repeat scroll 0% 0%; bo=
rder: 1px solid rgb(172, 172, 172); color: rgb(0, 0, 0); position: absolute=
; z-index: 2101; outline: medium none;}
..picker-modal-dialog-content {width: 705px; height: 370px; padding: 0px; ma=
rgin: 0px; position: relative;}
..picker-modal-dialog-bg {background: rgb(255, 255, 255) none repeat scroll =
0% 0%; left: 0px; position: absolute; top: 0px; z-index: 2100;}
..picker-modal-dialog-title {-moz-user-select: none; background: rgb(255, 25=
5, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 0); cursor: move; font-s=
ize: 20px; padding: 6px 8px 15px; position: relative; vertical-align: middl=
e; border-top: 10px solid rgb(255, 255, 255); border-left: 10px solid rgb(2=
55, 255, 255); border-right: 10px solid rgb(255, 255, 255);}
..picker-modal-dialog-title-text {display: block; overflow: hidden; text-ove=
rflow: ellipsis; white-space: nowrap;}
..picker-modal-dialog-title-close {cursor: pointer; position: absolute; righ=
t: 0px; top: 10px; opacity: 0.7;}
..picker-modal-dialog-dogfood-confidential-text {color: rgb(221, 75, 57); fo=
nt-size: 13px; font-weight: bold; overflow: hidden; position: absolute; rig=
ht: 30px; top: 10px; text-transform: uppercase;}
..picker-modal-dialog-title-close-hover {opacity: 1;}
..picker-modal-dialog-buttons {display: none;}
..picker-modal-dialog-content {border: 0px none;}
..picker-main-container .goog-buttonset-default {font-weight: bold;}
div.picker-navpane-root {position: relative; left: 0px; right: 0px; width: =
auto;}
..picker-content {width: auto; height: auto;}
..picker-searchbar-input-box {font-size: 13px;}
..picker-form {margin: 0px; padding: 0px;}
..picker-main-container .goog-toolbar {border: 0px none; background: rgba(0,=
0, 0, 0) none repeat scroll 0px center;}
..picker-header-close {display: none;}
..picker-native.picker-minew .picker-header-close {display: block;}
..picker-contactbin-chip-holder .picker-contactbin-input {width: 130px;}
..picker-album-control {border: 2px solid transparent; color: rgb(68, 68, 68=
); cursor: pointer; font-size: 11px; margin: 6px; position: relative; verti=
cal-align: top; outline: medium none;}
..picker-album-control-album-tile {box-shadow: 0px 1px 0px rgb(218, 218, 218=
); background-color: rgb(255, 255, 255); border: 1px solid rgb(229, 229, 22=
9); height: 158px; width: 163px;}
..picker-album-control:active ,.picker-album-control-checked {border: 2px so=
lid rgb(77, 144, 254);}
..picker-album-control-checked .picker-album-control-album-tile ,.picker-alb=
um-control-focused .picker-album-control-album-tile {box-shadow: none; bord=
er: 1px solid rgb(77, 144, 254);}
..picker-album-control-thumbs {height: 110px; width: 163px;}
..picker-album-control-thumb {border: medium none; height: 110px; padding: 0=
px; width: 163px;}
..picker-album-control-no-cover-thumb {background-color: rgb(238, 238, 238);=
opacity: 1 !important;}
..picker-album-control-title {margin: 0px; overflow: hidden; text-overflow: =
ellipsis; vertical-align: top; white-space: nowrap; width: 80%;}
..picker-album-control-photo-count-date {margin: 0px; overflow: hidden; text=
-overflow: ellipsis; vertical-align: top; white-space: nowrap; width: 80%; =
color: rgb(186, 186, 186); padding: 6px 0px 0px 7px;}
..picker-album-control-title {color: rgb(38, 38, 38); font-size: 13px; font-=
weight: bold; height: 20px; padding: 8px 10px 0px;}
..picker-album-control-photo-count {bottom: 9px; color: rgb(170, 170, 170); =
font-size: 11px; padding: 0px 10px; position: absolute;}
..picker-album-control-visibility .picker-spr-audience-acl-small-owner-only =
,.picker-album-control-visibility .picker-spr-audience-acl-small-limited ,.=
picker-album-control-visibility .picker-spr-audience-acl-small-extended-cir=
cles ,.picker-album-control-visibility .picker-spr-audience-acl-small-domai=
n-public ,.picker-album-control-visibility .picker-spr-audience-acl-small-p=
ublic {opacity: 0.4; bottom: 11px; display: inline-block; height: 12px; pos=
ition: absolute; right: 10px; vertical-align: top; width: 12px;}
..picker-album-control-thumbs .picker-spr-rio-checkmark-active ,.picker-albu=
m-control-thumbs .picker-spr-rio-checkmark-selected {display: inline-block;=
left: 5px; opacity: 0; position: absolute; top: 5px;}
..picker-album-control-hover .picker-spr-rio-checkmark-active ,.picker-album=
-control-focused .picker-spr-rio-checkmark-active {opacity: 0.7;}
..picker-album-control-checked .picker-spr-rio-checkmark-selected {opacity: =
1;}
..ozAppNoFocusOutline .picker-album-control {outline: 0px none;}
..picker-albumname .picker-photoupload-albumchooser {margin-right: 10px;}
..picker-albumname .picker-photoupload-albumchooser-select .goog-flat-menu-b=
utton-caption {overflow: hidden; text-overflow: ellipsis; white-space: nowr=
ap; width: 148px;}
..picker-albumname .picker-photoupload-albumchooser-select {margin-left: 2px=
; position: relative; top: -1px; width: 168px;}
..picker-camerasyncseparator {cursor: default; font-size: 12px; padding: 10p=
x 0px 7px;}
..picker-camerasyncseparator-checkbox {cursor: pointer; display: inline-bloc=
k; opacity: 0.3; transition: opacity 0.218s ease 0s; vertical-align: middle=
;}
..picker-camerasyncseparator-checkbox.picker-hover ,.picker-camerasyncsepara=
tor.picker-selected .picker-camerasyncseparator-checkbox {opacity: 1;}
..picker-camerasyncseparator.picker-selected .picker-camerasyncseparator-che=
ckbox.picker-hover {opacity: 0.8;}
..picker-camerasyncseparator-title {display: inline-block; font-size: 18px; =
padding: 2px 12px 0px 6px; vertical-align: middle;}
..picker-camerasyncseparator-details {display: inline-block; padding: 4px 12=
px 0px 0px; vertical-align: middle;}
..picker-camerasyncseparator-select-link {color: rgb(17, 85, 204); cursor: p=
ointer; display: inline-block; padding-top: 4px; vertical-align: middle;}
..picker-camerasyncseparator-select-link.picker-hover {text-decoration: unde=
rline;}
..picker-collection-control-title {color: rgb(68, 68, 68); display: inline-b=
lock; font-size: 14px; height: 16px; margin-bottom: 2px; margin-top: 10px; =
overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
..picker-collection-control-totalitems ,.picker-collection-control-timestamp=
{color: rgb(170, 170, 170); display: inline-block; font-size: 11px; margin=
: 0px 2px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;}
..picker-collection-control-timestamp::before {color: rgb(170, 170, 170); co=
ntent: "*"; font-size: 5px; vertical-align: middle;}
..picker-collection-control .picker-photosgrid .picker-dataview-content {pad=
ding: 0px;}
..picker-collection-control .picker-content {height: 100%; position: relativ=
e; overflow: visible;}
..picker-collectionsgrid {padding-left: 18px;}
..picker-collection-control-border {opacity: 0; transition: opacity 0.218s e=
ase 0s; position: relative;}
..picker-collection-control-checked .picker-collection-control-border {borde=
r: 5px solid rgb(66, 133, 244); padding: 0px; max-height: 207px;}
..picker-collection-control {cursor: default; display: inline-block; margin:=
5px 10px 0px 0px; padding: 0px 10px; outline: medium none; text-align: lef=
t; vertical-align: middle;}
..picker-docscollection-control {position: relative; margin: 10px; cursor: p=
ointer;}
..picker-docscollection-control-preview-container {position: relative;}
..picker-docscollection-control-preview-content {border: 6px solid transpare=
nt; bottom: 0px; left: 31px; position: absolute;}
..picker-docscollection-control-checked .picker-docscollection-control-previ=
ew-content {border: 6px solid rgb(77, 144, 254);}
..picker-docscollection-control-hover .picker-docscollection-control-preview=
-content {background-color: rgb(252, 249, 204);}
..picker-docscollection-control-focused .picker-docscollection-control-previ=
ew-content {outline: 1px solid rgb(66, 133, 244);}
..picker-docscollection-control-preview {background: rgb(238, 238, 238) none=
repeat scroll 0% 0%; border: 1px solid rgb(206, 206, 206); height: 116px; =
outline: medium none; position: relative; width: 116px;}
..picker-docscollection-control-child-1 {position: absolute; border: 1px sol=
id rgb(206, 206, 206); width: 116px; height: 116px; left: 2px; top: 2px;}
..picker-docscollection-control-child-2 {position: absolute; border: 1px sol=
id rgb(206, 206, 206); width: 116px; height: 116px; left: 4px; top: 4px;}
..picker-docscollection-control-preview .picker-spr-collection {display: inl=
ine-block; position: absolute; left: 51px; top: 51px;}
..picker-docscollection-control .jfk-checkbox {background-color: rgb(252, 24=
9, 204); display: none; outline: 4px solid rgb(252, 249, 204); position: ab=
solute; top: 1px;}
..picker-docscollection-control .jfk-checkbox.jfk-checkbox-checked {backgrou=
nd-color: rgb(255, 255, 255); display: inline-block; outline: medium none;}
..picker-docscollection-control-hover .jfk-checkbox {display: inline-block;}
..picker-dataview.picker-docs-images-view {padding-top: 0px;}
..picker-docs-images-view .new-upload-box .picker-photo-control-placeholder =
{border: 0px none;}
..picker-docs-images-label {font-size: 12px; overflow: hidden; padding-botto=
m: 6px; padding-top: 6px; text-align: center; text-overflow: ellipsis; whit=
e-space: nowrap;}
..picker-docs-images-preview {position: relative;}
..picker-docs-images-preview-content {border: 6px solid transparent; bottom:=
0px; outline: medium none; position: absolute;}
..picker-docs-images-focused .picker-docs-images-preview-content {outline: 1=
px solid rgb(66, 133, 244);}
..picker-docs-images-checked .picker-docs-images-preview-content {border: 6p=
x solid rgb(77, 144, 254);}
..picker-docs-images-preview-content .jfk-checkbox {background-color: rgb(25=
2, 249, 204); display: none; outline: 4px solid rgb(252, 249, 204); positio=
n: absolute; top: 1px;}
..picker-docs-images-preview-content .jfk-checkbox.jfk-checkbox-checked {bac=
kground-color: rgb(255, 255, 255); display: inline-block; outline: medium n=
one;}
..picker-docs-images-hover .picker-docs-images-preview-content .jfk-checkbox=
{display: inline-block;}
..picker-docs-images-preview-placeholder {border: 1px solid rgb(229, 229, 22=
9); bottom: 0px; outline: medium none; position: absolute;}
..picker-docs-images-hover .picker-docs-images-preview-content {background-c=
olor: rgb(252, 249, 204);}
..picker-photo-control-unselectable.picker-docs-images-hover .picker-docs-im=
ages-preview-content {background-color: transparent;}
..picker-photo-control-unselectable.picker-docs-images-hover .jfk-checkbox {=
display: none;}
..picker-photo-control-unselectable.picker-docs-images-container {opacity: 0=
..3; position: relative;}
..picker-docs-images-container {margin: 10px;}
..picker-docs-images-preview .nub-loading {display: none;}
..picker-drive-view .picker-searchbar {border-bottom: 1px solid rgb(229, 229=
, 229); margin-bottom: 0px; margin-left: 0px; padding-bottom: 15px;}
..picker-main-container .picker-drive-view.picker-dataview .picker-searchbar=
.picker-flat-menu-button {left: 341px;}
..picker-drive-view .picker-searchbar-input-logo ,.picker-drive-view .picker=
-searchbar-input {padding-left: 20px;}
..picker-dataview.picker-drive-view {overflow-y: hidden;}
..picker-drive-view .picker-content-container {bottom: 0px; left: 0px; overf=
low-y: auto; position: absolute; right: 0px; top: 69px;}
..picker-docs-images-view .picker-dataview-content {padding-left: 13px; padd=
ing-top: 10px;}
..picker-caption-bubble .picker-edit-caption-instructions {color: rgb(0, 0, =
0); font-size: 13px; margin-top: 3px;}
..picker-caption-bubble .picker-edit-caption-popup {padding: 0px 16px 0px 0p=
x; border: 0px none; margin: 0px;}
..picker-caption-bubble {z-index: 2112 !important;}
..picker-edit-caption {z-index: 2109; position: absolute;}
..picker-crop-content .picker-edit-caption {margin-top: 8px;}
..picker-crop-content .picker-edit-caption-hint {margin-top: 2px;}
..picker-crop-content .picker-edit-caption-popup {margin: 1px 0px 2px;}
..picker-edit-caption-hint ,.picker-crop-content .picker-edit-caption-hover =
..picker-edit-caption-hint {color: rgb(17, 85, 204); font-size: 13px; width:=
100%; overflow: hidden; text-align: center; text-overflow: ellipsis; white=
-space: nowrap; position: absolute; cursor: pointer;}
..picker-crop-content .picker-edit-caption-hint {color: rgb(153, 153, 153);}
..picker-edit-caption-hint.picker-video-control-metadata {text-align: left; =
width: 100%; margin-left: 0px;}
..picker-edit-caption-hint .picker-video-control-title {color: rgb(17, 85, 2=
04);}
..picker-edit-caption-input {width: 100%; margin: 0px 0px 0px -2px;}
..picker-edit-caption-instructions {color: rgb(102, 102, 102); font-size: 10=
px; margin-top: 2px;}
..picker-edit-caption-popup {background: rgb(255, 255, 255) none repeat scro=
ll 0% 0%; padding: 4px; border: 1px solid rgb(102, 102, 102); margin: 0px 0=
px 2px;}
..picker-crop-content .picker-edit-caption-popup {border: 1px solid transpar=
ent;}
..picker-main-container .picker-edit-toolbar-overlay {background-attachment:=
scroll; background-clip: border-box; position: relative; z-index: 2106; fo=
nt: 12px Roboto,Arial,sans-serif; margin: 0px; outline: medium none; paddin=
g: 0px;}
..picker-main-container .picker-edit-toolbar-overlay-background-dark {positi=
on: absolute; z-index: 2107; background-color: rgb(0, 0, 0); opacity: 0.6; =
width: 100%; height: 100%;}
..picker-main-container .picker-edit-toolbar-overlay-container {position: re=
lative; z-index: 2108;}
..picker-edit-toolbar-manager {position: relative;}
..picker-edit-toolbar {cursor: default; position: relative; z-index: 2106; f=
ont: 12px Roboto,Arial,sans-serif; margin: 0px; outline: medium none; paddi=
ng: 2px; background: rgba(0, 0, 0, 0) none repeat scroll 0% 0%; border: 0px=
none;}
..picker-edit-toolbar .goog-toolbar-button {margin: 0px; border: 0px none; p=
adding: 0px; font-family: Roboto,Arial,sans-serif; color: rgb(51, 51, 51); =
text-decoration: none; list-style: outside none none; vertical-align: middl=
e; cursor: default; outline: medium none; opacity: 0.8;}
..picker-edit-toolbar .goog-toolbar-button-outer-box ,.picker-edit-toolbar .=
goog-toolbar-button-inner-box {border: 0px none; vertical-align: top;}
..picker-edit-toolbar .goog-toolbar-button-outer-box {margin: 0px; padding: =
1px 0px;}
..picker-edit-toolbar .goog-toolbar-button-inner-box {margin: 0px -1px; padd=
ing: 3px 4px;}
* html .picker-edit-toolbar .goog-toolbar-button-inner-box ,body .picker-ed=
it-toolbar .goog-toolbar-button-inner-box {left: -1px;}
* html .picker-edit-toolbar .goog-toolbar-button-rtl .goog-toolbar-button-o=
uter-box ,body .picker-edit-toolbar .goog-toolbar-button-rtl .goog-toolbar-=
button-outer-box {left: -1px;}
* html .picker-edit-toolbar .goog-toolbar-button-rtl .goog-toolbar-button-i=
nner-box ,body .picker-edit-toolbar .goog-toolbar-button-rtl .goog-toolbar-=
button-inner-box {right: auto;}
:first-child + html .picker-edit-toolbar .goog-toolbar-button-inner-box {le=
ft: -1px;}
:first-child + html .picker-edit-toolbar .goog-toolbar-button-rtl .goog-too=
lbar-button-inner-box {left: 1px; right: auto;}
..picker-edit-toolbar .goog-toolbar-button-disabled {opacity: 0.3;}
..picker-edit-toolbar .goog-toolbar-button-disabled .goog-toolbar-button-out=
er-box ,.picker-edit-toolbar .goog-toolbar-button-disabled .goog-toolbar-bu=
tton-inner-box {color: rgb(51, 51, 51) !important; border-color: rgb(153, 1=
53, 153) !important;}
* html .picker-edit-toolbar .goog-toolbar-button-disabled ,:first-child + h=
tml .picker-edit-toolbar .goog-toolbar-button-disabled ,body .picker-edit-t=
oolbar .goog-toolbar-button-disabled {background-color: rgb(238, 238, 238);=
margin: 0px 1px; padding: 0px 1px;}
..picker-edit-toolbar .goog-toolbar-button-hover .goog-toolbar-button-outer-=
box ,.picker-edit-toolbar .goog-toolbar-button-active .goog-toolbar-button-=
outer-box ,.picker-edit-toolbar .goog-toolbar-button-checked .goog-toolbar-=
button-outer-box ,.picker-edit-toolbar .goog-toolbar-button-selected .goog-=
toolbar-button-outer-box {border-width: 1px 0px; border-style: solid; paddi=
ng: 0px;}
..picker-edit-toolbar .goog-toolbar-button-hover .goog-toolbar-button-inner-=
box ,.picker-edit-toolbar .goog-toolbar-button-active .goog-toolbar-button-=
inner-box ,.picker-edit-toolbar .goog-toolbar-button-checked .goog-toolbar-=
button-inner-box ,.picker-edit-toolbar .goog-toolbar-button-selected .goog-=
toolbar-button-inner-box {border-width: 0px 1px; border-style: solid; paddi=
ng: 3px;}
..picker-edit-toolbar .goog-toolbar-button-hover .goog-toolbar-button-outer-=
box ,.picker-edit-toolbar .goog-toolbar-button-hover .goog-toolbar-button-i=
nner-box {border-color: transparent !important;}
..picker-edit-toolbar .goog-toolbar-button-hover ,.picker-edit-toolbar .goog=
-toolbar-button-active ,.picker-edit-toolbar .goog-toolbar-button-checked ,=
..picker-edit-toolbar .goog-toolbar-button-selected {background-color: trans=
parent !important; opacity: 1;}
..picker-edit-toolbar .goog-toolbar-button-hover ,.picker-edit-toolbar .goog=
-toolbar-button-active ,.picker-edit-toolbar .goog-toolbar-button-checked ,=
..picker-edit-toolbar .goog-toolbar-button-selected {background: rgba(0, 0, =
0, 0) none repeat scroll 0% 0%;}
..picker-edit-toolbar .goog-toolbar-button-active .goog-toolbar-button-outer=
-box ,.picker-edit-toolbar .goog-toolbar-button-active .goog-toolbar-button=
-inner-box ,.picker-edit-toolbar .goog-toolbar-button-checked .goog-toolbar=
-button-outer-box ,.picker-edit-toolbar .goog-toolbar-button-checked .goog-=
toolbar-button-inner-box ,.picker-edit-toolbar .goog-toolbar-button-selecte=
d .goog-toolbar-button-outer-box ,.picker-edit-toolbar .goog-toolbar-button=
-selected .goog-toolbar-button-inner-box {border-color: transparent;}
..picker-edit-toolbar .goog-toolbar-button-collapse-right ,.picker-edit-tool=
bar .goog-toolbar-button-collapse-right .goog-toolbar-button-outer-box ,.pi=
cker-edit-toolbar .goog-toolbar-button-collapse-right .goog-toolbar-button-=
inner-box {margin-right: 0px;}
..picker-edit-toolbar .goog-toolbar-button-collapse-left ,.picker-edit-toolb=
ar .goog-toolbar-button-collapse-left .goog-toolbar-button-outer-box ,.pick=
er-edit-toolbar .goog-toolbar-button-collapse-left .goog-toolbar-button-inn=
er-box {margin-left: 0px;}
* html .picker-edit-toolbar .goog-toolbar-button-collapse-left .goog-toolba=
r-button-inner-box ,:first-child + html .picker-edit-toolbar .goog-toolbar-=
button-collapse-left .picker-edit-toolbar .goog-toolbar-button-inner-box ,b=
ody .picker-edit-toolbar .goog-toolbar-button-collapse-left .goog-toolbar-b=
utton-inner-box {left: 0px;}
..picker-edit-toolbar .goog-toolbar-menu-button {margin: 0px 2px; border: 0p=
x none; padding: 0px; font-family: Roboto,Arial,sans-serif; color: rgb(51, =
51, 51); text-decoration: none; list-style: outside none none; vertical-ali=
gn: middle; cursor: default; outline: medium none;}
..picker-edit-toolbar .goog-toolbar-menu-button-outer-box ,.picker-edit-tool=
bar .goog-toolbar-menu-button-inner-box {border: 0px none; vertical-align: =
top;}
..picker-edit-toolbar .goog-toolbar-menu-button-outer-box {margin: 0px; padd=
ing: 1px 0px;}
..picker-edit-toolbar .goog-toolbar-menu-button-inner-box {margin: 0px -1px;=
padding: 3px 4px;}
* html .picker-edit-toolbar .goog-toolbar-menu-button-inner-box ,body .pick=
er-edit-toolbar .goog-toolbar-menu-button-inner-box {left: -1px;}
* html .picker-edit-toolbar .goog-toolbar-menu-button-rtl .goog-toolbar-men=
u-button-outer-box ,body .picker-edit-toolbar .goog-toolbar-menu-button-rtl=
.goog-toolbar-menu-button-outer-box {left: -1px;}
* html .picker-edit-toolbar .goog-toolbar-menu-button-rtl .goog-toolbar-men=
u-button-inner-box ,body .picker-edit-toolbar .goog-toolbar-menu-button-rtl=
.goog-toolbar-menu-button-inner-box {right: auto;}
:first-child + html .picker-edit-toolbar .goog-toolbar-menu-button-inner-bo=
x {left: -1px;}
:first-child + html .picker-edit-toolbar .goog-toolbar-menu-button-rtl .pic=
ker-edit-toolbar .goog-toolbar-menu-button-inner-box {left: 1px; right: aut=
o;}
..picker-edit-toolbar .goog-toolbar-menu-button-disabled {opacity: 0.3;}
..picker-edit-toolbar .goog-toolbar-menu-button-disabled .goog-toolbar-menu-=
button-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-button-disabled .=
goog-toolbar-menu-button-inner-box {color: rgb(51, 51, 51) !important; bord=
er-color: rgb(153, 153, 153) !important;}
* html .picker-edit-toolbar .goog-toolbar-menu-button-disabled ,:first-chil=
d + html .picker-edit-toolbar .goog-toolbar-menu-button-disabled ,body .pic=
ker-edit-toolbar .goog-toolbar-menu-button-disabled {background-color: rgb(=
238, 238, 238); margin: 0px 1px; padding: 0px 1px;}
..picker-edit-toolbar .goog-toolbar-menu-button-hover .goog-toolbar-menu-but=
ton-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-button-active .goog-=
toolbar-menu-button-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-butt=
on-open .goog-toolbar-menu-button-outer-box {border-width: 1px 0px; border-=
style: solid; padding: 0px;}
..picker-edit-toolbar .goog-toolbar-menu-button-hover .goog-toolbar-menu-but=
ton-inner-box ,.picker-edit-toolbar .goog-toolbar-menu-button-active .goog-=
toolbar-menu-button-inner-box ,.picker-edit-toolbar .goog-toolbar-menu-butt=
on-open .goog-toolbar-menu-button-inner-box {border-width: 0px 1px; border-=
style: solid; padding: 3px;}
..picker-edit-toolbar .goog-toolbar-menu-button-hover .goog-toolbar-menu-but=
ton-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-button-hover .goog-t=
oolbar-menu-button-inner-box {border-color: rgb(192, 192, 192) !important;}
..picker-edit-toolbar .goog-toolbar-menu-button-active ,.picker-edit-toolbar=
.goog-toolbar-menu-button-open {background-color: rgb(238, 238, 238) !impo=
rtant;}
..picker-edit-toolbar .goog-toolbar-menu-button-active .goog-toolbar-menu-bu=
tton-outer-box ,.picker-edit-toolbar .goog-toolbar-menu-button-active .goog=
-toolbar-menu-button-inner-box ,.picker-edit-toolbar .goog-toolbar-menu-but=
ton-open .goog-toolbar-menu-button-outer-box ,.picker-edit-toolbar .goog-to=
olbar-menu-button-open .goog-toolbar-menu-button-inner-box {border-color: r=
gb(187, 187, 187);}
..picker-edit-toolbar .goog-toolbar-menu-button-caption {padding: 0px 4px 0p=
x 0px; vertical-align: middle;}
..picker-edit-toolbar .goog-toolbar-menu-button-dropdown {width: 7px; backgr=
ound: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/editortoolbar.png") no=
-repeat scroll -388px center; vertical-align: middle;}
..picker-edit-toolbar .goog-toolbar-separator {margin: 0px 2px; border-left:=
1px solid rgb(214, 214, 214); border-right: 1px solid rgb(247, 247, 247); =
padding: 0px; width: 0px; text-decoration: none; list-style: outside none n=
one; outline: medium none; vertical-align: middle; line-height: normal; fon=
t-size: 120%; overflow: hidden;}
..picker-edit-toolbar .goog-toolbar-select .goog-toolbar-menu-button-outer-b=
ox {border-width: 1px 0px; border-style: solid; padding: 0px;}
..picker-edit-toolbar .goog-toolbar-select .goog-toolbar-menu-button-inner-b=
ox {border-width: 0px 1px; border-style: solid; padding: 3px;}
..picker-edit-toolbar .goog-toolbar-select .goog-toolbar-menu-button-outer-b=
ox ,.picker-edit-toolbar .goog-toolbar-select .goog-toolbar-menu-button-inn=
er-box {border-color: rgb(191, 203, 223);}
..picker-actionpane-evph-message {position: absolute; top: 50%; height: 18px=
; margin-top: -9px; font-size: 13px; color: rgb(102, 102, 102);}
..picker-actionpane-evph-people {font-size: 13px; color: rgb(34, 34, 34); wi=
dth: 284px;}
..picker-actionpane-evph-people-title {font-weight: bold; padding-bottom: 8p=
x;}
..picker-actionpane-evph-people-img {border-radius: 2px; margin-right: 1px; =
border: 0px none;}
..picker-evph-people-jfk-bubble {z-index: 2200 !important;}
..picker-evph-plain-link {color: rgb(17, 85, 204); text-decoration: none; cu=
rsor: pointer;}
..picker-eventtheme-view .picker-listrenderer-table {margin: 15px 0px;}
..picker-eventtheme-border {position: relative; border: 1px solid rgb(204, 2=
04, 204);}
..picker-eventtheme-control-tablerow {outline: medium none;}
..picker-eventtheme-media {vertical-align: middle; cursor: pointer;}
..picker-eventtheme-control-tablerow.picker-list-control-checked {background=
-color: transparent;}
..picker-eventtheme {border: 6px solid transparent; margin: 5px 20px;}
..picker-list-control-checked.picker-list-control-focused .picker-eventtheme=
,.picker-list-control-checked .picker-eventtheme {border: 6px solid rgb(74=
, 151, 223);}
..picker-list-control-focused .picker-eventtheme-border {border: 1px solid r=
gb(77, 144, 254);}
..picker-flatphotosgrid .picker-flatphoto-control-wrapper.picker-featuredpho=
to-control {font-size: 12px; height: 170px; position: relative;}
..picker-featuredphoto-caption {overflow: hidden; position: absolute; text-a=
lign: left; text-overflow: ellipsis; white-space: nowrap;}
..picker-gmailfeaturedphoto-caption {bottom: 5px; box-sizing: border-box; ov=
erflow: hidden; position: absolute; text-overflow: ellipsis; white-space: n=
owrap; width: 100%;}
..picker-flatphotosgrid .picker-flatphoto-control-border {opacity: 0; transi=
tion: opacity 0.218s ease 0s; padding: 5px; position: relative;}
..picker-flatphoto-control-checked .picker-flatphoto-control-border {border:=
5px solid rgb(66, 133, 244); padding: 0px;}
..picker-flatphoto-control-focused .picker-flatphoto-control-border {outline=
: 1px solid rgb(66, 133, 244);}
..picker-flatphotosgrid .picker-flatphoto-control-wrapper {cursor: pointer; =
display: inline-block; margin: 10px; outline: medium none; text-align: cent=
er; vertical-align: middle;}
..picker-flatphotosgrid .picker-flatphoto-control-wrapper-with-description {=
position: relative;}
..picker-flatphoto-control-description {font-size: 12px; bottom: 5px; box-si=
zing: border-box; overflow: hidden; padding: 0px 5px; position: absolute; t=
ext-overflow: ellipsis; white-space: nowrap; width: 100%;}
..picker-flatphotosgrid .picker-flatphoto-control-thumbnail {max-height: 100=
%; max-width: 100%;}
..picker-flatphotosgrid .picker-flatphoto-control-hover .picker-flatphoto-co=
ntrol-check {opacity: 0.7;}
..picker-flatphotosgrid .picker-flatphoto-control-checked .picker-flatphoto-=
control-check {opacity: 1; top: 5px; left: 5px;}
..picker-flatphotosgrid .picker-flatphoto-control-check {opacity: 0; transit=
ion: opacity 0.218s ease 0s; position: absolute; top: 10px; left: 10px; z-i=
ndex: 2104;}
..picker-flatphotosgrid .picker-spr-rio-checkmark-selected {animation: 0.3s =
linear 0s normal none 1 running pickerPhotosSelectionOverlayCheckmarkSelect=
edTransition;}
..picker-flatphoto-control-unselectable {opacity: 0.3;}
..picker-flatphoto-control-unselectable .picker-flatphoto-control-check {dis=
play: none;}
..picker-flatphoto-message .picker-dataview-message {color: rgb(51, 51, 51);=
font-size: 16px; height: 16px; line-height: 16px; margin-top: -8px; positi=
on: absolute; text-align: center; top: 50%; width: 100%;}
..picker-highlightsphoto-control-border {opacity: 0; transition: opacity 0.2=
18s ease 0s; overflow: hidden;}
..picker-highlightsphoto-control-checked .picker-highlightsphoto-control-bor=
der {display: inline-block; position: relative;}
..picker-highlightsphoto-control-checked .picker-highlightsphoto-control-inn=
er-border {border: 3px solid rgb(66, 133, 244); display: inline-block; left=
: 0px; opacity: 1; position: absolute; top: 0px; z-index: 2104;}
..picker-highlightsphoto-control-focused {outline: medium none;}
..picker-highlightsphoto-control-focused .picker-highlightsphoto-control-bor=
der {outline: 1px solid rgb(66, 133, 244);}
..picker-highlightsphoto-control {cursor: pointer; display: inline-block; ve=
rtical-align: top;}
..picker-highlightsphoto-control-border {display: inline-block; margin: 1px;=
position: relative;}
..picker-highlightsphoto-control-inner-border {border: 3px solid transparent=
; display: none;}
..picker-highlightsphoto-control-hover {opacity: 0.7;}
..picker-highlightsphoto-control-checked {opacity: 1;}
..picker-highlightsphoto-control-hover .picker-highlightsphoto-control-check=
{opacity: 0.7;}
..picker-highlightsphoto-control-checked .picker-highlightsphoto-control-che=
ck {opacity: 1; left: 10px; top: 10px;}
..picker-highlightsphoto-control-check {transition: opacity 0.218s ease 0s; =
left: 10px; opacity: 0; position: absolute; top: 10px; z-index: 2104;}
..picker-highlightsphoto-control-unselectable {opacity: 0.3;}
..picker-highlightsphoto-control-unselectable .picker-highlightsphoto-contro=
l-check {display: none;}
..picker-momentscontrol-wrapper .picker-flatphoto-control-border {display: i=
nline-block; vertical-align: middle;}
..picker-momentscontrol-wrapper .picker-flatphoto-control-thumbnail {display=
: block;}
..picker-momentscontrol-wrapper.picker-flatphoto-control-wrapper {line-heigh=
t: 140px;}
..picker-momentchapter-title {color: rgb(85, 85, 85); font-size: 15px; font-=
weight: bold; padding: 20px 0px 0px 20px;}
..picker-collection-more-control {transition: background-color 130ms ease-in=
-out 0s; background-color: rgb(229, 229, 229); cursor: pointer; display: in=
line-block; margin: 1px; text-align: center; vertical-align: top; width: 40=
px;}
..picker-collection-more-control-content ,.picker-collection-more-control-im=
g {display: inline-block; margin: auto;}
..picker-collection-more-control-text {color: rgb(153, 153, 153); display: i=
nline-block; font-size: 12px; margin: 0px 2px; text-align: center; width: 3=
5px;}
..picker-collection-more-control-focused {outline: 1px solid rgb(66, 133, 24=
4);}
..picker-collection-more-control-hover {background-color: rgb(224, 224, 224)=
;}
..picker-noitemszone {height: 100%; left: 0px; position: absolute; text-alig=
n: center; top: 0px; width: 100%;}
..picker-noitemszone-container {text-align: center;}
..picker-noitemszone-text {color: rgb(170, 170, 170); font-size: 14px; font-=
weight: bold; margin: 20px 0px; text-align: center;}
..picker-noitemszone-title {color: rgb(170, 170, 170); font-size: 20pt; font=
-weight: bold; margin: 20px 0px; text-align: center;}
..picker-noitemszone-container .jfk-button {margin: 20px 0px;}
..picker-photo-album-control {border-bottom: 1px solid rgb(218, 218, 218); c=
ursor: pointer; font-size: 13px; left: -18px; outline: 0px none; padding: 2=
0px 25px; position: relative; top: -15px; width: 100%;}
..picker-photo-album-control-hover ,.picker-photo-album-control-focused {bac=
kground: rgb(243, 243, 243) none repeat scroll 0% 0%;}
..picker-photo-album-control-checked {background: rgb(77, 144, 254) none rep=
eat scroll 0% 0%; color: rgb(255, 255, 255);}
..picker-photo-album-control-title {padding-right: 10px;}
..picker-photo-album-control-new-album-label {padding-bottom: 8px;}
..picker-photo-album-control-name-edit {border-radius: 1px; box-sizing: bord=
er-box; border: 1px solid rgb(216, 216, 216); color: rgb(51, 51, 51); displ=
ay: inline-block; height: 29px; line-height: 20px; margin: 0px; padding: 8p=
x; width: 325px;}
..picker-photo-album-control-date {color: rgb(153, 153, 153); font-size: 12p=
x; padding-right: 5px;}
..picker-photo-album-control-checked .picker-photo-album-control-date {color=
: rgb(204, 204, 204);}
..picker-photo-album-control-caption {color: rgb(102, 102, 102); font-size: =
12px; padding-right: 8px;}
..picker-photo-album-control-checked .picker-photo-album-control-caption {co=
lor: rgb(204, 204, 204);}
..picker-photo-album-control-thumbs {height: 65px; overflow: hidden;}
..picker-photo-album-control-thumb {background-color: rgb(255, 255, 255); bo=
rder: 1px solid rgb(221, 221, 221); height: 48px; margin: 5px 8px 3px 1px; =
padding: 2px; width: 48px;}
..picker-photoalbumsview-actionpane-notice {cursor: default; float: right; h=
eight: 100%; margin-left: -30px;}
..picker-photoalbumsview-actionpane-notice .picker-actionpane-notice-td {col=
or: rgb(119, 119, 119); font-size: 11px; padding-right: 20px; text-align: r=
ight;}
..picker-curation-album-name-bar-album-select ,.picker-curation-album-name-b=
ar-album-select.goog-flat-menu-button-hover {background: rgb(255, 255, 255)=
none repeat scroll 0% 0%; height: 37px; line-height: 37px; margin-left: 15=
px; max-width: 300px; padding-left: 10px; text-align: left;}
..picker-curation-album-name-bar-album-select .goog-flat-menu-button-caption=
{max-width: 200px; overflow: hidden; padding: 0px 15px 0px 5px; text-overf=
low: ellipsis;}
..picker-curation-album-name-bar-album-select .goog-flat-menu-button-dropdow=
n {border: medium none; right: 10px; top: 10px;}
..picker-curation-album-name-bar .goog-menu {max-height: 300px; overflow-x: =
hidden; overflow-y: scroll; text-overflow: ellipsis; width: 280px; z-index:=
2115;}
..picker-curation-album-name-bar-empty-menu .goog-menu {height: 100px;}
..picker-curation-album-name-bar .picker-curation-album-name-bar-empty-menu =
..picker-loadingstatusbox {top: 70%; display: inline-block;}
..picker-curation-album-name-bar .picker-loadingstatusbox {display: none;}
..picker-curation-album-name-bar .picker-curation-album-name-bar-select-labe=
l-input {border-bottom: 1px solid rgb(204, 204, 204); margin-bottom: 4px; h=
eight: 36px; line-height: 36px;}
..picker-curation-album-name-bar .picker-curation-album-name-bar-select-labe=
l-input .jfk-textinput {box-shadow: none; border: medium none; padding: 0px=
16px; position: absolute; top: 0px; left: 0px; vertical-align: top; width:=
232px;}
..picker-curation-album-name-bar .goog-menuitem {padding: 6px 15px; width: 2=
32px;}
..picker-curation-album-name-bar .goog-menuitem-highlight {border-width: 0px=
;}
..picker-curation-album-name-bar .goog-menuitem-content {line-height: 24px; =
overflow: hidden; text-align: left; text-overflow: ellipsis; width: 250px;}
..picker-curation-album-name-bar-album-label-input {display: inline-block; m=
argin-left: 15px; position: relative;}
..picker-curation-album-name-bar-album-label-input .jfk-textinput {padding-r=
ight: 30px;}
..picker-curation-album-name-bar-album-label-input .picker-spr-black-close {=
opacity: 0.5; cursor: pointer; position: absolute; right: 14px; top: 28px;}
..picker-curation-order-dropdown-menu.goog-flat-menu-button-disabled {opacit=
y: 0.1;}
..picker-curation-view {height: 100%; position: absolute; top: 0px; bottom: =
0px; left: 0px; right: 0px;}
..picker-curation-grid-parent {position: absolute; top: 0px; bottom: 0px; le=
ft: 0px; right: 0px;}
..picker-curation-grid-wrapper {position: absolute; bottom: 0px; left: 0px; =
right: 0px;}
..picker-curation-bar {border-bottom: 1px solid rgb(229, 229, 229); line-hei=
ght: 64px; padding: 0px 20px;}
..picker-curation-bar .jfk-button ,.picker-curation-bar .goog-flat-button ,.=
picker-curation-bar .goog-flat-menu-button {cursor: pointer;}
..picker-curation-grid-wrapper {top: 71px; overflow-y: auto; overflow-x: hid=
den;}
..picker-curation-grid-parent {margin: 35px 15px 0px;}
..picker-curation-grid-parent .picker-dataview {overflow: visible; margin: 0=
px 0px 0px 20px; right: 20px;}
..picker-curation-hidden-input {position: absolute; top: -9999px; width: 1px=
; height: 1px;}
..picker-curation-bar .jfk-textinput {color: rgb(34, 34, 34); font-weight: b=
old; height: 37px; left: 20px; padding-bottom: 0px; padding-top: 0px; top: =
13px; width: 200px;}
..picker-curation-order-dropdown-menu {transition: all 0.218s ease 0s; backg=
round: rgb(241, 241, 241) none repeat scroll 0% 0%; border: 1px solid rgb(2=
16, 216, 216); height: 33px; line-height: 30px; vertical-align: middle; dis=
play: inline-block; margin-left: 20px;}
..picker-curation-order-dropdown-menu .goog-flat-menu-button-dropdown {borde=
r: medium none; display: inline-block; right: 10px; top: 10px;}
..picker-curation-bar {background: rgb(255, 255, 255) none repeat scroll 0% =
0%; height: 65px; text-align: right;}
..picker-curation-bar-left {position: absolute; text-align: left; z-index: 2=
120;}
..picker-curation-bar-toggles {border-radius: 2px; display: inline-block; he=
ight: 37px; line-height: 37px; margin-left: 20px; vertical-align: middle; b=
order: 1px solid rgb(216, 216, 216);}
..picker-curation-bar-toggles .goog-flat-button {opacity: 0.4; transition: a=
ll 0.218s ease 0s; background: rgb(255, 255, 255) none repeat scroll 0% 0%;=
margin: 0px; outline: medium none;}
..picker-curation-bar-toggles .goog-flat-button-checked {opacity: 1; backgro=
und: rgb(229, 229, 229) none repeat scroll 0% 0%;}
..picker-curation-bar-toggles .goog-flat-button.picker-curation-bar-large-th=
umb {padding: 9px;}
..picker-curation-bar-toggles .goog-flat-button.picker-curation-bar-small-th=
umb {padding: 13px;}
..picker-curation-upload-button-content {color: rgb(115, 115, 115); font-siz=
e: 13px; margin: 0px 4px;}
..picker-curation-view .picker-dropdown-menu.picker-curation-order-dropdown-=
menu {background: rgb(255, 255, 255) none repeat scroll 0% 0%; height: 37px=
; min-width: 37px; padding: 0px; text-align: center; vertical-align: middle=
; width: 37px; z-index: auto;}
..picker-curation-progress-parent {display: inline-block; vertical-align: mi=
ddle; transition: margin-top 0.218s ease 0s, opacity 0.218s ease 0s;}
..picker-curation-bar .picker-progress-bar {display: inline-block; font-size=
: 12px; vertical-align: middle;}
..picker-curation-bar .picker-curation-progress-label {display: inline-block=
; vertical-align: middle;}
..picker-curation-bar .picker-curation-progress-stop-upload ,.picker-curatio=
n-bar .jfk-textinput {display: inline-block; font-size: 12px; vertical-alig=
n: middle;}
..picker-curation-bar .picker-progress-bar {margin-left: 20px; width: 150px;=
}
..picker-curation-view .picker-progress-bar {border: 1px solid rgb(187, 187,=
187); background-color: rgb(229, 229, 229); box-shadow: 0px 0px 1px rgba(0=
, 0, 0, 0.2) inset;}
..picker-curation-view .progress-bar-thumb {border: 1px solid rgb(33, 117, 2=
55); background-color: rgb(77, 144, 254);}
..picker-curation-view .picker-progress-bar {height: 4px;}
..picker-curation-view .progress-bar-thumb {height: 4px; position: absolute;=
left: -1px; top: -1px;}
..picker-curation-bar .picker-curation-progress-label {margin-left: 10px; co=
lor: rgb(153, 153, 153); font-size: 12px;}
..picker-curation-bar .picker-curation-progress-stop-upload {margin-left: 10=
px; padding: 0px;}
..picker-curation-bar .jfk-button {transition: all 0.218s ease 0s; backgroun=
d: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 1px solid rgb(216, =
216, 216); height: 38px; line-height: 37px; margin: 0px; position: static; =
right: 20px; top: 17px;}
..picker-curation-bar .picker-spr-icon-computer {display: inline-block; marg=
in-right: 8px; vertical-align: middle; opacity: 0.8;}
..picker-curation-bar .jfk-button.jfk-button-focused .picker-spr-icon-comput=
er ,.picker-curation-bar .jfk-button.jfk-button-active .picker-spr-icon-com=
puter ,.picker-curation-bar .jfk-button.jfk-button-hover .picker-spr-icon-c=
omputer {opacity: 1;}
..picker-curation-drop-notice-parent {color: rgb(153, 153, 153); cursor: def=
ault; font-weight: bold; font-size: 13px; height: 65px; margin: auto; line-=
height: 65px; text-align: center; top: 0px;}
..picker-curation-drop-notice-text {padding: 0px 10px;}
..picker-spr-icon-zoom-min ,.picker-spr-icon-zoom-max ,.picker-curation-albu=
m-name-bar {display: inline-block;}
..picker-spr-icon-zoom-max {margin-left: 10px;}
..picker-spr-icon-zoom-min {margin-right: 5px;}
..picker-curation-drag-selector {z-index: 2200; position: absolute; border: =
1px solid rgba(136, 190, 190, 0.3); background: rgba(136, 187, 255, 0.4) no=
ne repeat scroll 0% 0%; box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2); border=
-radius: 2px; opacity: 0.8;}
..picker-curation-drag-scroll-mask {position: absolute; top: 0px; bottom: 0p=
x; left: 0px; right: 0px; opacity: 0; z-index: 2200;}
..picker-curation-drag-pile {position: absolute;}
..picker-curation-view .tt-photos-tagging-tcontent-button-container {display=
: none;}
..picker-curation-upload.picker-actionpane-frame {z-index: 2115; background-=
color: rgb(255, 255, 255);}
..picker-curation-drop-notice-parent .picker-actionpane-notice-td {border-ri=
ght: 128px solid transparent;}
..picker-curationview-autobackup-icon {height: 20px; margin: 8px; top: 14px;=
width: 20px;}
..picker-curationview-autobackup-promo {color: rgb(170, 170, 170); font-size=
: 13px; text-align: center; top: -53px; vertical-align: middle; width: 100%=
;}
..picker-curation-control {transition: border-color 0.2s ease 0s, margin 0.5=
s ease 0s, height 0.5s ease 0s, width 0.5s ease 0s, opacity 0.5s ease-out 0=
s, top 0.5s ease-out 0s, left 0.5s ease-out 0s, line-height 0.5s ease 0s, b=
ox-shadow 0.5s ease 0s; border-radius: 4px; outline: medium none; backgroun=
d-color: rgb(245, 245, 245); border-color: rgb(208, 208, 208); border-style=
: solid; border-width: 1px; overflow: hidden;}
..picker-curation-control.picker-curation-fast ,.picker-curation-control.pic=
ker-curation-fast .picker-curation-control-card ,.picker-curation-control.p=
icker-curation-fast-thumb .picker-curation-control-thumb-wrapper ,.picker-c=
uration-control.picker-curation-fast-thumb .picker-curation-control-thumb ,=
..picker-curation-control.picker-curation-fast-thumb .picker-curation-contro=
l-thumb-border ,.picker-curation-control.picker-curation-control-selected-r=
eordering .picker-curation-control-thumb-wrapper {transition: margin 0s eas=
e 0s, height 0s ease 0s, width 0s ease 0s, opacity 0.5s ease-out 0s, top 0s=
ease 0s, left 0s ease 0s;}
..picker-curation-control.picker-curation-fast .picker-curation-control-thum=
b-wrapper ,.picker-curation-control.picker-curation-fast .picker-curation-c=
ontrol-thumb ,.picker-curation-control.picker-curation-fast .picker-curatio=
n-control-thumb-border {transition: margin 0s ease 0s, height 0s ease 0s, w=
idth 0s ease 0s, opacity 0.5s ease-out 0s, top 0.5s ease 0s, left 0.5s ease=
0s;}
..picker-curation-control.picker-curation-control-rotating .picker-curation-=
control-thumb ,.picker-curation-control.picker-curation-control-rotating .p=
icker-curation-control-thumb-wrapper { }
..picker-curation-control.picker-curation-control-rotating .picker-curation-=
control-thumb-wrapper .picker-curation-control-thumb-border {transition: -w=
ebkit-transform 0.2s ease-in-out 0s;}
..picker-curation-control-card {transition: border-color 0.2s ease 0s, margi=
n 0.5s ease 0s, height 0.5s ease 0s, width 0.5s ease 0s, opacity 0.5s ease-=
out 0s, top 0.5s ease-out 0s, left 0.5s ease-out 0s, line-height 0.5s ease =
0s, box-shadow 0.5s ease 0s;}
..picker-curation-control ,.picker-curation-control-card ,.picker-curation-c=
ontrol-thumb-wrapper ,.picker-curation-control-upload-preview {position: ab=
solute;}
..picker-curation-control-thumb-wrapper {text-align: center; transition: bor=
der-color 0.2s ease 0s, margin 0.5s ease 0s, height 0.5s ease 0s, width 0.5=
s ease 0s, opacity 0.5s ease-out 0s, top 0.5s ease-out 0s, left 0.5s ease-o=
ut 0s, line-height 0.5s ease 0s, box-shadow 0.5s ease 0s; border-radius: 1p=
x; margin-top: -2px;}
..picker-curation-control-thumb {transition: border-color 0.2s ease 0s, marg=
in 0.5s ease 0s, height 0.5s ease 0s, width 0.5s ease 0s, opacity 0.5s ease=
-out 0s, top 0.5s ease-out 0s, left 0.5s ease-out 0s, line-height 0.5s ease=
0s, box-shadow 0.5s ease 0s; cursor: default; position: relative; line-hei=
ght: 0;}
..picker-curation-control-thumb-border {transition: border-color 0.2s ease 0=
s, margin 0.5s ease 0s, height 0.5s ease 0s, width 0.5s ease 0s, opacity 0.=
5s ease-out 0s, top 0.5s ease-out 0s, left 0.5s ease-out 0s, line-height 0.=
5s ease 0s, box-shadow 0.5s ease 0s; cursor: default; line-height: 0; posit=
ion: relative; display: inline-block; vertical-align: middle; background-co=
lor: rgb(255, 255, 255);}
..picker-curation-control-thumb-border-lines {transition: border-color 0.2s =
ease 0s; position: absolute; top: -3px; left: -3px; right: -3px; bottom: -3=
px; border: 2px solid transparent; z-index: 2107;}
..picker-curation-control-selected.picker-curation-control {border-color: rg=
b(77, 144, 254);}
..picker-curation-control-tag-adding-mode {position: absolute; display: inli=
ne-block; z-index: 2114;}
..picker-curation-control-toolbar {background: rgb(255, 255, 255) none repea=
t scroll 0% 0%; border-top: 1px solid rgb(208, 208, 208); overflow: hidden;=
cursor: default; line-height: 42px; height: 42px; position: absolute; bott=
om: 0px; width: 100%; outline: medium none;}
..picker-curation-control-small .picker-curation-control-toolbar {opacity: 0=
; transition: opacity 0.4s ease-out 0s, border-color 0.5s ease-in 0s, backg=
round-color 0.5s ease-in 0s; line-height: 0; height: 0px;}
..picker-curation-control-small.picker-curation-control-hover .picker-curati=
on-control-toolbar {opacity: 1; line-height: 42px; height: 42px;}
..picker-curation-control-caption-input.picker-curation-control-toolbar-disa=
bled ,.picker-curation-control-toolbar-icon.picker-curation-control-toolbar=
-rotate-disabled ,.picker-curation-control-toolbar-icon.picker-curation-con=
trol-toolbar-icon-hover.picker-curation-control-toolbar-rotate-disabled {op=
acity: 0; cursor: default; visibility: hidden;}
..picker-curation-control-hover .picker-curation-control-caption-input {opac=
ity: 1;}
..picker-curation-control-has-caption-focus .picker-curation-control-caption=
-input {opacity: 1; overflow: visible; color: rgb(51, 51, 51);}
..picker-curation-control-caption-input {transition: color 0.3s ease 0s, opa=
city 0.3s ease 0s, border-color 0.3s ease 0s, width 0.5s ease 0s, height 0.=
5s ease 0s, box-shadow 0.5s ease 0s; color: rgb(153, 153, 153); font-family=
: Roboto,Arial,sans-serif; font-size: 13px; border: 0px none; margin: auto;=
outline: medium none; overflow: hidden; padding: 0px 8px; resize: none; wi=
dth: 70%; height: 16px;}
..picker-curation-control-caption-input.picker-curation-control-disabled {ba=
ckground-color: transparent;}
..picker-curation-control-upload-preview {left: 0px; right: 0px; bottom: 0px=
; height: 40px; min-width: 40px;}
..picker-curation-control-upload-preview.picker-curation-control-upload-prev=
iew-empty {left: -156px; height: 40px; width: 312px;}
..picker-curation-control-upload-preview .picker-progress-bar {width: 50%; p=
osition: absolute; bottom: 24px; margin-top: -4px; left: 50%; margin-left: =
-25%;}
..picker-curation-view .picker-curation-control-upload-preview .picker-progr=
ess-bar ,.picker-curation-view .picker-curation-control-upload-preview .pro=
gress-bar-thumb {height: 2px;}
..picker-curation-control.picker-curation-control-nudge-left ,.picker-curati=
on-control.picker-curation-control-nudge-right {transition: margin 0.3s eas=
e 0s;}
..picker-curation-control.picker-curation-control-nudge-left {margin-left: -=
50px; z-index: 2104;}
..picker-curation-control.picker-curation-control-nudge-left .picker-curatio=
n-control-thumb {transition: color 0.3s ease 0s, opacity 0.3s ease 0s, bord=
er-color 0.3s ease 0s, width 0s ease 0s, height 0s ease 0s, box-shadow 0.5s=
ease 0s; box-shadow: -5px 0px 8px rgba(0, 0, 0, 0.3);}
..picker-curation-control.picker-curation-control-nudge-right {margin-left: =
50px; z-index: 2104;}
..picker-curation-control.picker-curation-control-nudge-right .picker-curati=
on-control-thumb {transition: color 0.3s ease 0s, opacity 0.3s ease 0s, bor=
der-color 0.3s ease 0s, width 0s ease 0s, height 0s ease 0s, box-shadow 0.5=
s ease 0s; box-shadow: 5px 0px 8px rgba(0, 0, 0, 0.3);}
..picker-curation-control.picker-curation-control-selected.picker-curation-c=
ontrol-nudge-left ,.picker-curation-control.picker-curation-control-selecte=
d.picker-curation-control-nudge-right {margin-left: 0px;}
..picker-curation-control.picker-curation-control-unselected-reordering {tra=
nsition: opacity 0.6s ease 0s, top 0.2s ease-out 0s, left 0.2s ease-out 0s,=
line-height 0.2s ease 0s;}
..picker-curation-control.picker-curation-control-unselected-reordering .pic=
ker-curation-control-thumb ,.picker-curation-control.picker-curation-contro=
l-unselected-reordering .picker-curation-control-thumb-wrapper {transition:=
top 0.3s ease-out 0s, left 0.3s ease-out 0s, line-height 0.3s ease 0s;}
..picker-curation-control.picker-curation-control-unselected-reordering.pick=
er-curation-control-changelines {opacity: 0;}
..picker-curation-control.picker-curation-control-selected-reordering {z-ind=
ex: 2103; transition: top 0.1s ease-out 0s, left 0.3s ease-out 0s;}
..picker-curation-control.picker-curation-control-selected-reordering.picker=
-curation-control-dropped {transition: none 0s ease 0s ;}
..picker-curation-control.picker-curation-control-dragging {opacity: 0; tran=
sition: opacity 0.2s ease-out 0s, top 0.5s ease-out 0s, left 0.5s ease-out =
0s, margin 0.2s ease-out 0s;}
..picker-curation-drag-control-img {position: absolute; bottom: 0px; left: 5=
0%; width: 100%; height: 100%; cursor: pointer; box-shadow: 0px 3px 25px rg=
ba(0, 0, 0, 0.6);}
..picker-curation-drag-control-img-box {position: relative;}
..picker-curation-drag-control-img ,.picker-curation-drag-control-img-box {z=
-index: 2106;}
..picker-curation-drag-control-img-box.picker-curation-drag-control-stack-1 =
{z-index: 2105; position: absolute; margin-top: 5px; margin-left: 5px; tran=
sform: rotate(7deg);}
..picker-curation-drag-control-img-box.picker-curation-drag-control-stack-2 =
{z-index: 2105; position: absolute; margin-top: -5px; margin-left: -5px; tr=
ansform: rotate(-10deg);}
..picker-curation-drag-control-count {position: absolute; height: 23px; line=
-height: 23px; border-radius: 3px; background: rgb(77, 144, 254) none repea=
t scroll 0% 0%; color: rgb(255, 255, 255); text-align: center; font-size: 1=
3px; font-weight: bold; top: 0px; margin-top: -15px; left: 50%; margin-left=
: -36px; width: 72px; z-index: 2109; box-shadow: 0px 2px 20px rgba(0, 0, 0,=
0.8);}
..picker-curation-control-toolbar.jfk-bubble {z-index: 2113 !important; line=
-height: 0; margin: 0px; padding: 0px; min-width: 124px;}
..picker-curation-control-error-bubble.jfk-bubble {z-index: 2112 !important;=
}
..picker-curation-control-toolbar-top-buttons {border-left: 1px dashed rgb(2=
21, 221, 221); overflow: hidden; position: absolute; cursor: default; top: =
0px; right: 0px; display: inline;}
..picker-curation-control-small .picker-curation-control-toolbar-top-buttons=
{border: 0px none; text-align: center; width: 100%; z-index: 2108;}
..picker-curation-control-toolbar-icon {cursor: pointer; display: inline-blo=
ck; opacity: 0.4; transition: color 0.3s ease 0s, opacity 0.13s ease 0s, bo=
rder-color 0.3s ease 0s, width 0s ease 0s, height 0s ease 0s, box-shadow 0.=
5s ease 0s; margin: 0px 7px; vertical-align: middle;}
..picker-curation-control-toolbar.picker-curation-control-toolbar-is-cover .=
picker-curation-control-toolbar-icon.picker-spr-checkbox-active {opacity: 0=
;}
..picker-curation-control-toolbar-top-buttons .picker-curation-control-toolb=
ar-icon-hover {opacity: 0.7;}
..picker-curation-control-toolbar-icon.picker-curation-control-toolbar-icon-=
active {opacity: 1;}
..tt-photos-ttagoverlay .tt-photos-tagging-bubble {font-size: 10px; line-hei=
ght: 1em; padding: 8px; z-index: 2108 !important;}
..picker-curation-control .tt-photos-tagging-acl-msg {margin-top: 2px;}
..picker-curation-control .tt-photos-tagging-bubble-spinner {margin-left: 2p=
x;}
..picker-main-container .tacotown-autocomplete-box {z-index: 2115;}
..picker-curation-control .tt-photos-tagging-tcontent-remove-button {backgro=
und: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/docs/picker/images/dialog_clos=
e_small.gif") no-repeat scroll 0% 0% padding-box content-box; height: 15px;=
margin-bottom: -3px; width: 15px;}
..picker-curation-control .tt-photos-ttagoverlay-cursor.tt-photos-ttagoverla=
y-tagged .tt-photos-ttagoverlay-cursor-ring-inner ,.picker-curation-control=
.tt-photos-ttagoverlay-cursor.tt-photos-ttagoverlay-tagged .tt-photos-ttag=
overlay-cursor-ring-outer ,.picker-curation-control .tt-photos-ttr-ring .tt=
-photos-ttr-ring-inner ,.picker-curation-control .tt-photos-ttr-ring .tt-ph=
otos-ttr-ring-outer {border-width: 6px;}
..picker-curation-control .tt-photos-ttagoverlay-cursor.tt-photos-ttagoverla=
y-tagged .tt-photos-ttagoverlay-cursor-ring ,.picker-curation-control .tt-p=
hotos-ttr-ring .tt-photos-ttr-ring-inner ,.picker-curation-control .tt-phot=
os-ttr-ring .tt-photos-ttr-ring-outer {bottom: -6px; left: -6px; right: -6p=
x; top: -6px;}
..picker-curation-control-is-cover.picker-curation-control-small .picker-cur=
ation-control-cover-selected ,.picker-curation-control-small.picker-curatio=
n-control-hover .picker-curation-control-cover ,.picker-curation-control-is=
-cover.picker-curation-control-hover .picker-curation-control-cover ,.picke=
r-curation-control-error-holder ,.picker-curation-control-thumb ,.picker-cu=
ration-control-loaded .picker-curation-control-upload-preview ,.picker-cura=
tion-control-cancel .picker-curation-control-upload-preview ,.picker-curati=
on-control-error .picker-curation-control-upload-preview ,.picker-curation-=
control-small .picker-curation-control-caption-container ,.picker-curation-=
control-caption-input.picker-curation-control-toolbar-disabled ,.picker-cur=
ation-control-toolbar-icon.picker-curation-control-toolbar-rotate-disabled =
,.picker-curation-control-toolbar-icon.picker-curation-control-toolbar-icon=
-hover.picker-curation-control-toolbar-rotate-disabled {display: none;}
..picker-curation-control-caption-container ,.picker-curation-control-error =
..picker-curation-control-error-holder ,.picker-curation-control-loaded .pic=
ker-curation-control-thumb {display: inline;}
..picker-curation-control-cover {background-color: rgb(38, 38, 38);}
..picker-curation-control-hover .picker-curation-control-cover {opacity: 0.7=
; z-index: 2108;}
..picker-curation-control-tag-adding-mode .picker-curation-control-cover {op=
acity: 0.7;}
..picker-curation-control-cover-selected {background-color: rgb(77, 144, 254=
);}
..picker-curation-control-hover .picker-curation-control-is-hover-cover.pick=
er-curation-control-cover ,.picker-curation-control-is-hover-cover.picker-c=
uration-control-cover ,.picker-curation-control-is-cover .picker-curation-c=
ontrol-cover-selected {opacity: 1;}
..picker-curation-control-cover-selected .picker-spr-checkmark-checked {disp=
lay: inline-block; margin: 5px; vertical-align: middle;}
..picker-curation-control-cover-selected .picker-curation-control-cover-text=
{padding-left: 0px;}
..picker-curation-control-cover ,.picker-curation-control-tag-adding-mode.pi=
cker-curation-control-is-cover .picker-curation-control-cover ,.picker-cura=
tion-control-cover-selected {border-radius: 5px; opacity: 0; bottom: 10px; =
cursor: pointer; display: inline-block; left: 10px; position: absolute;}
..picker-curation-control-cover-text {color: rgb(255, 255, 255); display: in=
line-block; font-size: 13px; font-weight: bold; line-height: 13px; padding:=
8px;}
..picker-curation-control.picker-curation-control-loaded.picker-curation-con=
trol-small.picker-curation-control-hover {transition: opacity 0.4s ease-out=
0s, border-color 0.5s ease-in 0s, background-color 0.5s ease-in 0s; backgr=
ound-color: rgb(245, 245, 245); border-color: rgb(208, 208, 208);}
..picker-curation-control.picker-curation-control-loaded.picker-curation-con=
trol-small.picker-curation-control-selected {background-color: rgb(245, 245=
, 245); border-color: rgb(77, 144, 254);}
..picker-curation-control.picker-curation-control-loaded.picker-curation-con=
trol-small {background-color: transparent; border: 1px solid transparent;}
..picker-curation-control-error-holder {z-index: 2111; bottom: 0px; left: 0p=
x; position: absolute; right: 0px; text-align: center; top: 0px;}
..picker-curation-control-retry ,.picker-curation-control-error-delete {marg=
in: 5px; color: rgb(17, 85, 204); cursor: pointer;}
..picker-curation-control-error-separator {color: rgb(204, 204, 204);}
..picker-curation-control-error-icon {display: inline-block; height: 66px; l=
eft: 50%; margin-top: -33px; margin-left: -33px; position: absolute; top: 5=
0%; width: 66px; vertical-align: middle; transition: all 0.5s ease 0s; back=
ground-repeat: no-repeat;}
..picker-curation-control-error-text {font-size: 11px; text-align: center; w=
idth: 110px;}
..picker-curation-control-small .picker-curation-control-error-icon {height:=
14px; margin-left: -7px; margin-top: -7px; width: 14px;}
..picker-curation-control-preview-background {background-color: rgb(255, 255=
, 255); bottom: 0px; left: 0px; position: absolute; right: 0px; top: 0px;}
..picker-photo-control-thumbframe .picker-photo-control-description {width: =
auto; position: static; margin: 0px 5px;}
..picker-photo-control-thumbframe .picker-photo-control-bottom-controls {wid=
th: 158px;}
..picker-photo-control-attribution {cursor: pointer;}
..picker-photo-control-thumbframe .picker-video-play-icon {position: absolut=
e; left: 60px; top: 40px;}
..new-upload-box .picker-photo-control-thumbframe .picker-video-play-icon {t=
op: 60px;}
..picker-photo-control-thumbframe .picker-video-filename {width: 158px;}
..picker-photo-control-thumbframe .picker-photo-control-preview.picker-proce=
ssing-video {width: 158px; height: 158px;}
..picker-photo-control-thumbframe .picker-video-processing-box {height: 158p=
x;}
..picker-photo-control-thumbframe .picker-photo-control-preview.picker-proce=
ssing-video ,.picker-dataview-content .picker-photo-control ,.picker-datavi=
ew-content .picker-photo-control-focused.picker-photo-control ,.picker-data=
view-content .picker-photosuploadview .picker-photo-control.picker-photo-co=
ntrol-focused ,.picker-dataview-content .picker-photosgrid-edit .picker-pho=
to-control.picker-photo-control-focused {border: 0px none transparent;}
..picker-photo-control-thumbframe .picker-photo-control-preview.picker-proce=
ssing-video {background-color: transparent;}
..picker-photo-control-thumbframe .picker-photo-control-description {height:=
auto;}
..picker-albumname-album-cell {font-size: 13px;}
..picker-albumname-label {margin-right: 5px;}
..picker-albumname-input {margin: 0px 10px 1px 2px; width: 172px;}
..picker-albumname .goog-link-button {padding: 6px 0px;}
:first-child + html .picker-albumname .picker-albumname-album-cell .goog-li=
nk-button {position: relative; top: 6px;}
..picker-photosgrid-edit .picker-albumname {padding: 0px 7px;}
..picker-photosgrid-edit .picker-photo-control {padding: 0px 2px 12px;}
..picker-photosgrid-edit {padding: 12px 0px 0px 1px;}
..picker-albumsgrid .picker-dataview-content ,.picker-photosgrid .picker-dat=
aview-content {padding: 0px 13px 15px;}
..picker-dataview.picker-albumsgrid ,.picker-dataview.picker-photosgrid-came=
rasync {padding-top: 0px;}
..picker-breadcrumbs-content .picker-photosgrid .picker-dataview-content {pa=
dding-top: 14px;}
..picker-photo-control {vertical-align: middle; text-align: center; margin: =
1px; font-size: 0px; border: 1px solid rgb(255, 255, 255);}
..picker-photosuploadview .picker-photo-control.picker-photo-control-focused=
,.picker-photosgrid-edit .picker-photo-control.picker-photo-control-focuse=
d {border: 1px solid rgb(255, 255, 255);}
..picker-photo-control-focused.picker-photo-control {border: 1px solid rgb(7=
4, 151, 223);}
..picker-photo-control-preview {font-size: 0px; position: relative;}
..picker-photo-control-placeholder {background: transparent url("//ssl.gstat=
ic.com/docs/picker/images/placeholder-v1.gif") repeat scroll 0% 0%;}
..picker-photo-control-preview-content {cursor: pointer; outline: medium non=
e;}
..picker-upload-control-error .picker-photo-control-uploading {border: 1px s=
olid rgb(221, 221, 221); background-color: rgb(255, 255, 255);}
..picker-photo-control-preview-content .uploader-thumb-img {display: block; =
position: relative;}
..picker-photo-control-unselectable .picker-photo-control-preview-content {c=
ursor: default;}
..picker-photo-control-attribution {position: absolute; bottom: 0px; left: 7=
px; right: 7px; overflow: hidden; white-space: nowrap; text-overflow: ellip=
sis; font-size: 10px; text-align: left;}
* html .picker-photo-control-attribution ,body .picker-photo-control-attrib=
ution {width: 100%;}
..picker-photo-control-attribution-spacer {font-size: 10px; visibility: hidd=
en;}
..picker-photo-control-bottom-controls {bottom: -8px; width: 100%;}
..picker-photo-control-description {position: absolute; left: 0px; font-size=
: 13px; color: rgb(153, 153, 153); width: 100%; height: 1.2em; overflow: hi=
dden; text-align: center; text-overflow: ellipsis; white-space: nowrap;}
..picker-photosgrid-edit .picker-photo-control-description.goog-control-hove=
r {text-decoration: underline; cursor: pointer;}
..picker-photosgrid-camerasync {padding: 10px 13px;}
..picker-photosgrid-separator {font-size: 11px; color: rgb(170, 170, 170); m=
argin: 0px 10px 0px 8px;}
..picker-photosgrid-separatorhr {border-width: 1px 0px 0px; border-style: so=
lid none none; border-color: rgb(221, 221, 221) currentcolor currentcolor; =
-moz-border-top-colors: none; -moz-border-right-colors: none; -moz-border-b=
ottom-colors: none; -moz-border-left-colors: none; border-image: none; marg=
in-left: -1px;}
..picker-photo-control-border ,.picker-photosgrid-edit .picker-photo-control=
-checked .picker-photo-control-border {border: 6px solid transparent;}
..picker-photo-control-checked .picker-photo-control-border {border: 6px sol=
id rgb(77, 144, 254);}
..picker-photo-control .photo-image-edit-controls {position: absolute; top: =
-20px; right: 0px;}
..picker-photo-control-checked .photo-image-edit-controls {top: -26px; right=
: -6px;}
..picker-photo-control .photo-image-edit-caption {left: 50%; top: -35px; mar=
gin-left: -144px;}
..picker-photo-control .progress-bar-horizontal {position: absolute; bottom:=
4px; left: 4px; right: 4px; height: 5px; border: 0px none; text-align: lef=
t; background: transparent none repeat scroll 0% 0%;}
* html .picker-photo-control .progress-bar-horizontal ,body .picker-photo-c=
ontrol .progress-bar-horizontal {left: 0px; right: 0px; width: 100%;}
..picker-photo-control .progress-bar-thumb {background: rgb(136, 136, 136) n=
one repeat scroll 0% 0%; height: 5px;}
..picker-upload-control-canceled .picker-photo-control-preview .progress-bar=
-horizontal ,.picker-upload-control-default .picker-photo-control-preview .=
progress-bar-horizontal ,.picker-upload-control-error .picker-photo-control=
-preview .progress-bar-horizontal ,.picker-upload-control-scheduled .picker=
-photo-control-preview .progress-bar-horizontal ,.picker-upload-control-suc=
cess .picker-photo-control-preview .progress-bar-horizontal {display: none;=
}
..picker-upload-control-error .picker-photo-control-message {position: absol=
ute; bottom: 0px; left: 0px; right: 0px; height: 10px; border: 0px none; pa=
dding: 2px; text-align: left; background: rgb(215, 0, 0) none repeat scroll=
0% 0%; color: rgb(255, 255, 255); white-space: nowrap; overflow: hidden; t=
ext-overflow: ellipsis; font-size: 9px; cursor: default;}
* html .picker-photo-control .picker-photo-control-message ,body .picker-ph=
oto-control .picker-photo-control-message {left: 0px; right: 0px; width: 10=
0%; padding: 0px;}
..new-upload-box .picker-photo-control-uploading ,.new-upload-box .picker-ph=
oto-control-placeholder {background: rgb(238, 238, 238) none repeat scroll =
0% 0%; border: 1px solid rgb(206, 206, 206);}
..picker-upload-control-error .picker-photo-control-preview .picker-photo-co=
ntrol-uploading {background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..picker-upload-control-running .picker-photo-control-preview .progress-bar-=
horizontal {display: inline;}
..new-upload-box .progress-bar-thumb {height: 100%; background-repeat: repea=
t-x; background-size: 20px 10px; background-color: rgb(204, 204, 204); back=
ground-attachment: scroll; background-image: linear-gradient(315deg, transp=
arent, transparent 33%, rgba(0, 0, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%, t=
ransparent 66%, transparent); animation-duration: 0.8s; animation-iteration=
-count: infinite; animation-timing-function: linear;}
..new-upload-box .progress-bar-horizontal {right: 0px; bottom: 0px; left: 0p=
x; height: 8px; border: 1px solid rgb(153, 153, 153); margin: 0px 8px 8px; =
padding: 1px; background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..new-upload-box .picker-progress-bar-spinner.progress-bar-horizontal {borde=
r: 0px none; background: transparent url("//ssl.gstatic.com/docs/picker/ima=
ges/loading-v1.gif") no-repeat scroll 0px 0px; height: 16px; width: 16px; m=
argin: auto auto 5px; opacity: 0.5;}
..picker-video-control-thumb-table {width: 100%; position: relative; top: 10=
5px; z-index: 2200; opacity: 0.8; color: rgb(153, 153, 153); font-size: 10p=
x; height: 20px;}
..picker-video-filename {position: relative; top: 38px; z-index: 2104; heigh=
t: 13px; width: 120px; text-overflow: ellipsis; white-space: nowrap; overfl=
ow: hidden; font-size: 12px; color: rgb(153, 153, 153);}
..picker-video-spinner {position: relative; top: 5px; right: 1px; z-index: 2=
100; background-image: url("//ssl.gstatic.com/docs/picker/images/loading-v1=
..gif"); height: 16px; width: 16px; opacity: 0.5;}
..picker-photo-control-preview.picker-processing-video {background-color: rg=
b(238, 238, 238); border: 1px solid rgb(206, 206, 206); width: 120px; heigh=
t: 120px;}
..picker-video-processing-box {height: 120px; left: 0px; position: absolute;=
top: 0px; width: auto;}
..picker-video-play-icon {position: absolute; left: 12px; top: 12px;}
..jfk-bubble.picker-video-bubble {padding-top: 30px; z-index: 2200 !importan=
t; top: 0px;}
..picker-photo-control-unselectable .picker-photo-control-preview-content .u=
ploader-thumb-img {opacity: 0.3; position: relative;}
..picker-albumslist {padding: 15px 0px 0px 15px;}
..picker-content.picker-gridview-bandselect.picker-flatphotosgrid .picker-fl=
atphoto-control-wrapper ,.picker-content.picker-gridview-bandselect {cursor=
: crosshair;}
..picker-photosview .picker-dataview {padding-top: 0px;}
..picker-profile-toolbar.picker-edit-toolbar {padding: 0px; width: 160px;}
..picker-profile-toolbar .goog-button {margin: 3px; padding: 7px; text-trans=
form: uppercase; font-size: 11px; cursor: pointer; white-space: nowrap;}
..picker-profile-toolbar .goog-button-hover {background-color: rgb(238, 238,=
238);}
..picker-profile-toolbar-icon {opacity: 0.4; margin-right: 8px; vertical-ali=
gn: middle;}
..picker-profile-toolbar-label {vertical-align: middle;}
..picker-profileview {font-size: 13px; padding: 20px;}
..picker-profileview-photo {border: 6px solid rgb(77, 144, 254); width: 96px=
; height: 96px;}
..picker-profileview-text {margin-left: 115px;}
..picker-searchbarimagefilter {margin-right: 5px; padding-top: 2px;}
..picker-searchbarimagefilter-type-button {margin: 0px 5px 0px 0px; vertical=
-align: middle;}
..picker-searchbarimagefilter-colorbox {border: 3px solid transparent; heigh=
t: 19px; margin: 0px; opacity: 0.5; padding: 1px; width: 19px; vertical-ali=
gn: middle;}
..picker-searchbarimagefilter-colorbox-inner {border: 1px solid rgb(153, 153=
, 153); cursor: pointer; height: 19px; margin: -1px 0px 0px -1px; padding: =
0px; width: 19px;}
..picker-gplus .picker-searchbarimagefilter-colorbox-inner {margin: 0px; bor=
der: 0px none;}
..picker-searchbarimagefilter-colorbox[aria-selected=3D"true"] {background-c=
olor: rgb(255, 255, 255); border-color: rgb(77, 144, 254); opacity: 1;}
..picker-webcam-control {overflow: hidden;}
..picker-webcam {padding: 20px; text-align: center; z-index: 2110;}
..picker-webcam-buttons.goog-inline-block {width: auto; position: absolute;}
..picker-webcam .picker-webcam-buttons .jfk-button {z-index: 1;}
..picker-webcam .goog-slider-horizontal {height: 5px; background: rgb(229, 2=
29, 229) none repeat scroll 0% 0%; -moz-user-select: none; border-radius: 3=
px;}
..picker-webcam .goog-slider-horizontal.picker-slider-hover {background: rgb=
(209, 209, 209) none repeat scroll 0% 0%;}
..picker-webcam .goog-slider-horizontal .goog-slider-thumb {display: block; =
position: absolute; top: -7px; left: 0px; width: 15px; height: 15px; z-inde=
x: 1; border: 1px solid rgb(153, 153, 153); background-color: rgb(153, 153,=
153); cursor: col-resize; box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1); tran=
sition: left 0.1s ease 0s; border-radius: 8px;}
..picker-webcam .goog-slider-horizontal.picker-slider-hover .goog-slider-thu=
mb {background-color: rgb(255, 255, 255);}
..picker-webcam .goog-slider-horizontal .goog-slider-thumb .goog-slider-drag=
ging {background-color: rgb(83, 82, 82);}
..picker-webcam-icon {background: rgb(255, 255, 255) none repeat scroll 0% 0=
%; border: medium none; border-radius: 0px; height: 10px; width: 10px; disp=
lay: inline-block; margin-bottom: -1px; margin-right: 1px;}
..picker-webcam .picker-webcam-play-icon {background: transparent none repea=
t scroll 0% 0%; border-top: 5px solid transparent; border-bottom: 5px solid=
transparent; border-left: 10px solid rgb(51, 51, 51); height: 0px; width: =
0px;}
..picker-webcam .picker-webcam-stop-icon {background: rgb(51, 51, 51) none r=
epeat scroll 0% 0%;}
..picker-webcam .picker-webcam-working-icon {border-radius: 5px;}
..picker-webcam-timer {font-size: 13px; color: rgb(68, 68, 68); width: 80px;=
text-align: right; margin-left: 16px;}
..picker-webcam-working .picker-webcam-timer {background: rgb(245, 245, 245)=
none repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); text-alig=
n: center; position: absolute; top: 0px; padding: 5px 5px 6px; margin-left:=
0px;}
..picker-webcam-volume-button {padding: 6px; border: 1px solid transparent; =
position: absolute; height: 16px; width: 36px; top: 0px;}
..picker-spr-mic {margin-right: 7px;}
..picker-webcam-volume-button.goog-control-hover {border: 1px solid rgb(153,=
153, 153); border-radius: 2px;}
..picker-webcam-volume-meter {margin-right: 2px; margin-bottom: 4px; backgro=
und: rgb(153, 153, 153) none repeat scroll 0% 0%; width: 2px; height: 2px;}
..picker-webcam-volume-meter.picker-webcam-volume-meter-on {height: 7px; bac=
kground: rgb(0, 153, 51) none repeat scroll 0% 0%;}
..picker-webcam-volume-meter.picker-webcam-volume-meter-red.picker-webcam-vo=
lume-meter-on {background: rgb(209, 72, 54) none repeat scroll 0% 0%;}
..picker-youtube-banner-preview {margin: 20px; color: rgb(68, 68, 68);}
..picker-youtube-banner-preview-header {font-size: 20px; font-weight: normal=
;}
..picker-youtube-banner-preview-message {font-size: 13px; margin-top: 15px;}
..picker-youtube-banner-preview-container {margin-right: 20px; display: inli=
ne-block;}
..picker-youtube-banner-preview-icon-header {text-transform: uppercase; colo=
r: rgb(102, 102, 102); font-size: 13px; text-align: center;}
..picker-youtube-banner-preview-icon {background: rgba(0, 0, 0, 0) url("//ss=
l.gstatic.com/docs/picker/images/youtube-banner-sprite-v2.png") no-repeat s=
croll 0% 0%; position: relative;}
..picker-youtube-banner-preview-tv-icon {background-position: 0px 0px; width=
: 271px; height: 165px;}
..picker-youtube-banner-preview-laptop-icon {background-position: -271px 0px=
; width: 294px; height: 168px;}
..picker-youtube-banner-preview-mobile-icon {background-position: -565px 0px=
; width: 85px; height: 164px;}
..picker-youtube-banner-preview-desktop-image ,.picker-youtube-banner-previe=
w-tv-image ,.picker-youtube-banner-preview-mobile-image {position: absolute=
;}
..picker-youtube-banner-preview-desktop-image {top: 29px; left: 65px; width:=
168px; height: 29px;}
..picker-youtube-banner-preview-tv-image {top: 5px; left: 5px; width: 260px;=
height: 144px;}
..picker-youtube-banner-preview-mobile-image {top: 13px; left: 6px; width: 7=
3px; height: 20px;}
..picker-youtube-banner-preview-button-container {position: absolute; left: =
10px; bottom: 10px;}
..picker-youtube-banner-preview-loadingstatusbox {opacity: 0.8; font-size: 0=
px; position: absolute; top: 0px; left: 0px; width: 100%; height: 100%; z-i=
ndex: 2111; background: white url("//ssl.gstatic.com/docs/picker/images/loa=
ding-32-v1.gif") no-repeat scroll center center;}
..picker-youtube-banner-preview-auto-enhance {float: right; margin: 20px;}
..picker-youtube-banner-preview-toggle-label-container {display: inline-bloc=
k;}
..picker-youtube-banner-preview-toggle-label-container .picker-spr-icon-auto=
fix-active {display: inline-block; vertical-align: middle;}
..picker-content.picker-draguploadview {height: 100%; padding: 0px; overflow=
: hidden;}
..picker-upload-button-hidden .picker-draguploadview .picker-photos-upload-d=
ropzone-parent {height: 100%;}
..picker-draguploadview .picker-jfk-tall-progressbar {width: 70%;}
..picker-draguploadview-tip {font-size: 13px; padding: 5px;}
..picker-drag-drop-supported .picker-draguploadview-progress-parent {positio=
n: absolute; height: 50px; top: 50%; margin-top: -25px;}
..picker-draguploadview-progress-parent {position: relative; height: 40px; w=
idth: 100%; top: -20px;}
..picker-draguploadview-msg-bar {position: absolute; top: 10px; width: 80%; =
left: 10%; z-index: 2200;}
..picker-draguploadview-msg-bar .jfk-butterBar-shown {height: 30px;}
..picker-photos-upload-album-bar {z-index: 2102; position: relative;}
..picker-photos-upload-album-bar-cell {height: 1px;}
..picker-photos-upload-dropzone ,.picker-photos-upload-dropzone-cell {width:=
100%; text-align: center; position: relative;}
:first-child + html .picker-photos-upload-dropzone-cell {height: 100%; padd=
ing-top: 100px;}
..picker-upload-button-visible .picker-drag-drop-supported .picker-photos-up=
load-dropzone-cell {border: 4px dashed rgb(221, 221, 221); border-radius: 2=
px;}
..picker-drag-active .picker-upload-button-visible .picker-photos-upload-dro=
pzone-cell {border-color: rgb(77, 144, 254);}
..picker-photos-upload-dropzone-cell .jfk-button {margin: 0px;}
..picker-photos-upload-drop-alt {display: none; padding: 15px 0px 5px; font-=
weight: bold; font-size: 13px; color: rgb(204, 204, 204);}
..picker-photos-upload-drop-here {font-size: 20pt; color: rgb(204, 204, 204)=
; padding: 0px 10px; display: none;}
..picker-drag-active .picker-photos-upload-drop-here {color: rgb(57, 137, 21=
2);}
..picker-drag-drop-supported .picker-photos-upload-drop-alt ,.picker-drag-dr=
op-supported .picker-photos-upload-drop-here {display: block;}
..picker-photos-upload-dropzone-parent {height: 100%; width: 100%; position:=
relative; border-spacing: 20px;}
..picker-upload-button-hidden .picker-photos-upload-dropzone-parent {height:=
auto;}
..picker-photos-upload-dropzone-parent.picker-collapsed {margin: 0px 0px -40=
px;}
..picker-photos-upload-hidden-button {position: absolute; top: -1000px; left=
: -1000px;}
..jfk-butterBar-error .picker-link {color: rgb(255, 255, 255); text-decorati=
on: underline;}
..picker-photo-control-thumbframe {box-shadow: 0px 1px 0px rgb(218, 218, 218=
); width: 158px; height: 188px; background: rgb(255, 255, 255) none repeat =
scroll 0% 0%; border: 1px solid transparent; cursor: pointer;}
..picker-photo-control-thumbframe .picker-photo-control-uploading ,.picker-p=
hoto-control-thumbframe .new-upload-box-error .picker-photos-error-text {bo=
rder: 0px none transparent;}
..picker-upload-control-error .picker-photo-control-thumbframe .picker-photo=
-control-uploading {height: 158px;}
..picker-photosuploadview .new-upload-box .picker-photo-control-thumbframe .=
picker-photo-control-uploading .new-upload-box-error ,.picker-photo-control=
-thumbframe .new-upload-box-error .picker-photos-upload-filename {backgroun=
d: rgb(245, 245, 245) none repeat scroll 0% 0%;}
..new-upload-box .picker-photo-control-thumbframe .new-upload-box-error .pic=
ker-spr-upload-error {margin: 50px 74px 40px 73px;}
..picker-video-control-duration {position: absolute; display: inline-block; =
left: 9px; bottom: 8px; color: rgb(255, 255, 255); background: rgb(199, 199=
, 199) none repeat scroll 0% 0%; border-radius: 20px; font-weight: bold; pa=
dding: 2px 10px 3px 25px; font-size: 11px; text-shadow: 0px 0px 2px rgba(0,=
0, 0, 0.5);}
..picker-photosuploadview .picker-video-control-duration {padding: 2px 10px;=
}
..picker-photo-control-toolbar {background-color: rgb(255, 255, 255); bottom=
: 2px; height: 32px; left: 2px; position: absolute; width: 158px;}
..picker-photo-control-toolbar .picker-spr-checkbox-selected {cursor: pointe=
r; position: relative; right: 62px; top: 4px;}
..picker-photo-control-toolbar .picker-spr-checkbox-active {cursor: pointer;=
position: relative; right: 62px; top: 4px; opacity: 0.2;}
..picker-photo-control-toolbar .picker-spr-checkbox-active.picker-spr-checkb=
ox-active-hover {opacity: 1;}
..picker-photo-control-toolbar .picker-spr-checkbox-selected {display: none;=
}
..picker-photo-control-toolbar .picker-spr-checkbox-active {display: inline-=
block;}
..picker-photosuploadview .picker-photo-control-thumbframe {cursor: default;=
}
..new-upload-box .picker-photos-upload-filename ,.new-upload-box .picker-vid=
eos-upload-loadingthumb {color: rgb(153, 153, 153); font-size: 11px; overfl=
ow: hidden; background: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..picker-photosuploadview .new-upload-box .picker-photo-control-uploading {b=
ackground: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..picker-photosuploadview .new-upload-box .picker-photo-control-uploading .n=
ew-upload-box-error {background: rgb(255, 255, 255) none repeat scroll 0% 0=
%;}
..new-upload-box-error .picker-photos-upload-filename ,.new-upload-box-error=
.picker-videos-upload-loadingthumb {color: rgb(153, 153, 153); font-size: =
11px; overflow: hidden; background: rgb(255, 255, 255) none repeat scroll 0=
% 0%;}
..new-upload-box .picker-photos-upload-filename ,.new-upload-box-error .pick=
er-photos-upload-filename {width: 120px; height: 120px; padding: 0px;}
..new-upload-box .picker-upload-filename-inner ,.new-upload-box-error .picke=
r-upload-filename-inner {padding-top: 58px; text-overflow: ellipsis; white-=
space: nowrap; overflow: hidden; font-size: 12px;}
..new-upload-box .picker-spr-photo-icon {display: inline-block; opacity: 0.5=
; position: absolute; left: 51px; top: 40px;}
..new-upload-box-error .picker-spr-photo-icon {display: none;}
..new-upload-box .new-upload-box-error .picker-spr-upload-error {position: a=
bsolute; margin: 40px 55px 40px 50px; top: 0px;}
..nub-loading .picker-spr-upload-error {display: none;}
..picker-upload-control-error .picker-spr-photo-upload-cancel ,.picker-uploa=
d-control-scheduled .picker-spr-photo-upload-cancel {opacity: 0.5; position=
: absolute; right: 8px; bottom: 8px; cursor: pointer;}
..picker-upload-control-running .picker-spr-photo-upload-cancel ,.picker-upl=
oad-control-success .picker-spr-photo-upload-cancel ,.picker-photo-control-=
placeholder .picker-spr-photo-upload-cancel {display: none;}
..picker-upload-control-error .picker-spr-upload-retry {opacity: 0.5; positi=
on: absolute; left: 8px; bottom: 8px; cursor: pointer;}
..picker-upload-control-error .picker-photos-upload-retry-text {position: ab=
solute; left: 19px; bottom: -1px; cursor: pointer; color: rgb(0, 0, 0); fon=
t-size: 12px;}
..picker-upload-control-running .picker-spr-upload-retry ,.picker-upload-con=
trol-success .picker-spr-upload-retry ,.picker-photo-control-placeholder .p=
icker-spr-upload-retry ,.picker-upload-control-scheduled .picker-spr-upload=
-retry {display: none;}
..new-upload-box-error .picker-photos-error-text {position: absolute; top: 0=
px; left: 0px; right: 0px; bottom: 27px; font-weight: bold; font-size: 12px=
; background-color: rgb(238, 238, 238); border: 1px solid rgb(204, 204, 204=
); padding-top: 15px;}
..new-upload-box-error .picker-photos-error-details {position: absolute; top=
: 44px; left: 11px; right: 11px; padding: 2px; background: rgb(238, 238, 23=
8) none repeat scroll 0% 0%; font-size: 12px; font-weight: normal;}
..new-upload-box .picker-photos-upload-controls ,.new-upload-box-error .pick=
er-photos-upload-controls {background: transparent none repeat scroll 0% 0%=
; position: absolute !important; height: 20px; bottom: 0px; left: 0px; text=
-decoration: none; width: 100%;}
..picker-photo-control-preview-content {transition: opacity 250ms ease 0s;}
..picker-photo-control-preview-smartcrop-content {transition: opacity 450ms =
linear 100ms; opacity: 0; position: absolute; top: 0px;}
..picker-edit-toolbar-overlay-container .picker-spr-icon-photos-delete-white=
,.picker-edit-toolbar-overlay-container .picker-spr-icon-rotate-left-white=
,.picker-edit-toolbar-overlay-container .picker-spr-icon-rotate-right-whit=
e {display: none;}
..picker-photosuploadview-albumbar-visible .picker-albumname {position: rela=
tive;}
..picker-photosuploadview .picker-dataview {position: relative; margin: -10p=
x; overflow: visible;}
..picker-photosuploadview.picker-photosuploadview-albumbar-visible .picker-d=
ataview {margin: 10px -10px -10px;}
..picker-photosuploadview .picker-photosgrid .picker-dataview-content ,.pick=
er-photosuploadview .picker-photosgrid-edit {padding: 0px;}
..picker-photosuploadview .picker-dataview-message {display: none;}
..picker-photosuploadview-albumbar-visible .picker-dropzone ,.picker-photosu=
ploadview-albumbar-visible .picker-progress-wrapper {top: 50px;}
..picker-photosuploadview .goog-toolbar-button {cursor: pointer;}
..picker-photosuploadview .picker-photo-control-preview-content {outline: me=
dium none; cursor: default;}
..picker-photosuploadview .picker-photo-control-checked .picker-photo-contro=
l-border {border: 6px solid transparent;}
..picker-localphotosprofilephoto .picker-photo-control-border ,.picker-local=
photosprofilephoto.picker-photo-control-checked .picker-photo-control-borde=
r {border: 4px solid rgb(221, 75, 57); margin: 2px;}
..picker-photosuploadview-progress-wrapper ,.picker-photosuploadview-progres=
s-text ,.picker-photosuploadview-progress {position: absolute; top: 0px; ri=
ght: 0px; bottom: 0px; left: 0px;}
..picker-photosuploadview-progress-text {width: 70%; margin: auto;}
..picker-photosuploadview-progress {height: 9px; width: 70%; margin: auto;}
..picker-photosuploadview-progress-text {height: 41px; padding: 0px 0px 6px =
4px; font-size: 13px;}
..picker-photosuploadview-progress-wrapper .picker-progress-bar {width: 100%=
;}
..picker-photosuploadview-msgbar {position: absolute; top: 10px; width: 80%;=
left: 10%; z-index: 2200;}
..picker-photosuploadview-msgbar .jfk-butterBar-shown {height: 30px;}
..picker-photosuploadview .picker-photo-control-uploading {background: rgb(2=
43, 243, 243) none repeat scroll 0% 0%;}
..picker-photosuploadview .picker-photosgrid .picker-photo-control {padding:=
0px 0px 12px;}
..picker-photosuploadview-progress .progress-bar-horizontal ,.picker-photosu=
ploadview-actionpane .progress-bar-horizontal {height: 9px; border: 1px sol=
id rgb(153, 153, 153); margin: 2px; padding: 1px; background: rgb(255, 255,=
255) none repeat scroll 0% 0%;}
..picker-photosuploadview-progress .picker-progress-bar-spinner.progress-bar=
-horizontal ,.picker-photosuploadview-actionpane .picker-progress-bar-spinn=
er.progress-bar-horizontal {border: 0px none; background: transparent url("=
//ssl.gstatic.com/docs/picker/images/loading-v1.gif") no-repeat scroll 0px =
0px; height: 16px; width: 16px; padding-left: 7px; padding-top: 2px; margin=
: auto auto 5px; opacity: 0.5;}
..picker-photosuploadview-progress .progress-bar-thumb ,.picker-photosupload=
view-actionpane .progress-bar-thumb {height: 100%; background-repeat: repea=
t-x; background-size: 20px 10px; background-color: rgb(77, 144, 254); backg=
round-image: linear-gradient(315deg, transparent, transparent 33%, rgba(0, =
0, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%, transparent 66%, transparent); ba=
ckground-attachment: scroll; animation-duration: 0.8s; animation-iteration-=
count: infinite; animation-timing-function: linear;}
..picker-upload-photo-album-bar {position: absolute; top: 20px; left: 20px; =
height: 30px; padding: 0px;}
..picker-photo-upload-dropzone {position: absolute; top: 50px; left: 0px; ri=
ght: 0px; bottom: 0px;}
..picker-youtube-banner-recommended-size-messages {position: absolute; botto=
m: 20px; right: 20px; padding: 20px; color: rgb(204, 204, 204); text-align:=
right;}
..picker-youtube-banner-channel-art-link {text-decoration: none;}
..picker-docsuploadview-drive-promo {background-color: rgb(229, 229, 229); c=
ursor: default; height: 125px; left: 0px; overflow: hidden; position: absol=
ute; top: 0px; width: 100%; z-index: 1; transition: height 0.218s ease 0s;}
..picker-docsuploadview-with-drive-promo .picker-docsuploadview-drive-promo =
{border-bottom: 1px solid rgb(229, 229, 229);}
..picker-docsuploadview-drive-promo-text {padding-right: 40px; position: abs=
olute; top: 0px;}
..picker-docsuploadview-drive-promo-title {font-size: 18px; padding: 15px 5p=
x 5px 0px; white-space: nowrap;}
..picker-docsuploadview-drive-promo-paragraph {color: rgb(68, 68, 68); font-=
size: 13px; max-width: 650px;}
..picker-docsuploadview-drive-promo-dismiss {padding-top: 5px;}
..picker-docsuploadview-drive-promo-learnmore ,.picker-docsuploadview-drive-=
promo-up-to-link {color: rgb(17, 85, 204); cursor: pointer; text-decoration=
: none; white-space: nowrap;}
..picker-docsuploadview-drive-promo-learnmore.picker-hover ,.picker-docsuplo=
adview-drive-promo-up-to-link.picker-hover {text-decoration: underline;}
..picker-docsuploadview-drive-promo-img {margin: 15px 30px;}
..picker-docsuploadview-drive-promo-close {padding: 10px; position: absolute=
; right: 0px; top: 0px;}
..picker-folderbar {border-bottom: 1px solid rgb(221, 221, 221); height: 49p=
x; position: absolute; top: 0px; left: 0px; width: 100%;}
..picker-folderbar-menu {position: absolute; top: 10px; left: 10px;}
..picker-folderbar-menu .jfk-bubble-content-id {width: 300px;}
..picker-du-folderpopup-buttons .jfk-button {margin-top: 13px;}
..picker-docsuploadview.picker-upload {overflow: hidden; padding: 0px;}
..picker-docsuploadview .picker-dataview ,.picker-docsuploadview .picker-dro=
pzone {top: 50px;}
..picker-docsuploadview-with-drive-promo .picker-dataview ,.picker-docsuploa=
dview-with-drive-promo .picker-dropzone {top: 120px;}
..picker-doc-upload-control-cell {border-bottom: 1px solid rgb(221, 221, 221=
);}
..picker-doc-upload-control-row {height: 50px;}
..picker-doc-upload-control-icon-cell {width: 36px;}
..picker-doc-upload-control-icon {display: block; margin-top: 4px; margin-le=
ft: 10px; padding-top: 3px; width: 16px; height: 16px; background-repeat: n=
o-repeat;}
..picker-doc-upload-control-text ,.picker-doc-upload-control-retry-text ,.pi=
cker-docs-upload-error-dialog {font-size: 13px;}
..picker-doc-upload-control-retry-text {color: rgb(17, 85, 204);}
..picker-doc-upload-control-retry-text .jfk-button {cursor: pointer;}
..picker-doc-upload-control-retry-text .jfk-button-hover {text-decoration: u=
nderline;}
..picker-docsuploadview-uploadmore-button {display: inline-block; margin: 16=
px 20px;}
..picker-doc-upload-control-error-message {color: rgb(204, 51, 51);}
..picker-doc-upload-control-cell .picker-spr-upload-error {display: inline-b=
lock; margin-top: 5px; vertical-align: text-bottom;}
..picker-doc-upload-control-error-message {margin-left: 8px;}
..picker-docs-upload-error-dialog {width: 300px; z-index: 2112;}
..picker-docs-upload-error-dialog-bg {z-index: 2111;}
..picker-docs-upload-error-dialog-button::-moz-focus-inner {border: 0px none=
;}
..picker-doc-upload-control-progress {text-align: right; width: 130px;}
..picker-doc-upload-control-progress .progress-bar-horizontal {height: 9px; =
border: 1px solid rgb(153, 153, 153); margin: 2px; padding: 1px; background=
: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..picker-doc-upload-control-progress .progress-bar-thumb {height: 100%; back=
ground-repeat: repeat-x; background-size: 20px 10px; background-color: rgb(=
77, 144, 254); background-image: linear-gradient(315deg, transparent, trans=
parent 33%, rgba(0, 0, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%, transparent 6=
6%, transparent); background-attachment: scroll; animation-duration: 0.8s; =
animation-iteration-count: infinite; animation-timing-function: linear;}
..picker-doc-upload-control-cancel {width: 45px;}
..picker-doc-upload-control-cancel-x .jfk-button {cursor: pointer; height: a=
uto; margin: 0px 17px; width: auto;}
..picker-doc-upload-control-size {margin-left: 15px; font-size: 12px; color:=
rgb(102, 102, 102);}
..picker-doc-upload-control-name ,.picker-doc-upload-control-size {cursor: d=
efault;}
..picker-doc-upload-control-row.picker-upload-control-scheduled .picker-spr-=
photo-upload-cancel {display: none;}
..picker-doc-upload-control-complete {color: rgb(204, 204, 204);}
..picker-doc-upload-more {margin-left: 10px;}
..picker-doc-upload-control-row.picker-upload-control-error .picker-spr-phot=
o-upload-cancel {position: static; opacity: 1;}
..picker-upload-control-error .progress-bar-horizontal {display: none;}
..picker-drag-indicator-top ,.picker-drag-indicator-left ,.picker-drag-indic=
ator-right ,.picker-drag-indicator-bottom {position: absolute; z-index: 220=
0; background-color: rgb(77, 144, 254);}
..picker-drag-indicator-top ,.picker-drag-indicator-bottom {height: 3px; wid=
th: 100%; left: 0px;}
..picker-drag-indicator-left ,.picker-drag-indicator-right {height: 100%; wi=
dth: 3px; top: 0px;}
..picker-drag-indicator-top {top: 0px;}
..picker-drag-indicator-left {left: 0px;}
..picker-drag-indicator-right {right: 0px;}
..picker-drag-indicator-bottom {bottom: 0px;}
..picker-drag-tooltip {position: absolute; display: table; top: 50%; left: 5=
0%; width: 350px; margin-left: -175px; height: 40px; margin-top: -20px; bac=
kground-color: rgb(77, 144, 254); color: rgb(255, 255, 255); font-weight: b=
old; padding: 10px; font-size: 13px; z-index: 2200; text-align: center; box=
-shadow: 0px 1px 3px rgba(0, 0, 0, 0.2); border-radius: 2px;}
..picker-drag-tooltip-inner {display: table-cell; vertical-align: middle;}
..picker-dropzone ,.picker-dropzone-target ,.picker-dropzone-targetcontent ,=
..picker-dropzone-targetcontentwrapper {position: absolute; top: 0px; right:=
0px; bottom: 0px; left: 0px;}
..picker-drag-drop-supported .picker-dropzone-targetpointer {cursor: pointer=
;}
..picker-dropzone.goog-control-focused {border: 1px solid rgb(221, 221, 221)=
;}
..picker-drag-drop-supported .picker-dropzone-text ,.picker-drag-drop-suppor=
ted .picker-dropzone-alttext {display: block;}
..picker-dropzone-or {color: rgb(170, 170, 170); font-size: 14px; padding: 0=
px 0px 16px;}
..picker-dropzone-upload-button {padding: 5px 12px;}
..picker-dropzone-text ,.picker-dropzone-alttext ,.picker-spr-rio-upload-big=
{display: none;}
..picker-dropzone.picker-drag-drop-supported .picker-spr-rio-upload-big {opa=
city: 0.4; display: inline-block;}
..picker-dropzone .picker-dropzone-target {border-width: 3px;}
..picker-drag-active .picker-dropzone-target {background: rgb(245, 245, 245)=
none repeat scroll 0% 0%; border-color: rgb(77, 144, 254);}
..picker-dropzone-targetcontent {text-align: center;}
..picker-dropzone-targetcontentwrapper {margin: auto; height: 30px;}
..picker-dropzone-largetargetcontentwrapper {height: 200px;}
..picker-dropzone-text {color: rgb(170, 170, 170); font-size: 20pt; padding:=
0px 10px;}
..picker-dropzone-alttext {color: rgb(204, 204, 204); font-size: 13px; font-=
weight: bold; padding: 15px 0px 5px;}
..picker-dropzone-targetcontent .jfk-button {cursor: pointer; margin-right: =
0px;}
..picker-upload.picker-inline-upload {border-bottom: 1px solid rgb(229, 229,=
229); height: 119px; position: relative;}
..picker-inline-upload-icon {display: inline-block; left: 20px; opacity: 0.4=
; position: absolute; top: 15px;}
..picker-drag-drop-supported.picker-inline-upload-container {visibility: vis=
ible;}
..picker-inline-upload-container {border: 2px dashed rgb(221, 221, 221); bor=
der-radius: 2px; bottom: 20px; left: 20px; position: absolute; right: 30px;=
top: 20px; visibility: hidden;}
..picker-drag-active .picker-inline-upload-container {border: 2px dashed rgb=
(77, 144, 254);}
..picker-inline-upload-dropzone {height: 100%;}
..picker-inline-upload-dropzone-text {bottom: 26px; color: rgb(170, 170, 170=
); display: inline-block; font-size: 20px; left: 90px; padding-right: 5px; =
position: absolute;}
..picker-drag-active .picker-inline-upload-dropzone-text {color: rgb(57, 137=
, 212);}
..picker-inline-upload-button-container {bottom: 20px; position: absolute; r=
ight: 10px;}
..picker-upload-button-visible .picker-inline-upload-button {visibility: vis=
ible;}
..picker-inline-upload-button-pre-text {color: rgb(170, 170, 170); display: =
inline-block; font-size: 20px; padding-right: 10px;}
..picker-inline-upload .picker-draguploadview-progress-parent {text-align: c=
enter;}
..picker-inline-upload-actionpane-button {float: right; margin-right: 31px;}
..picker-main-container .goog-tree-hide-root {display: none;}
..picker-main-container .goog-tree-item {-moz-user-select: none;}
..picker-main-container .goog-tree-item .selected {-moz-user-select: none; v=
ertical-align: middle; cursor: default; white-space: nowrap; background-col=
or: rgb(77, 144, 254); color: rgb(255, 255, 255); font-weight: bold;}
..picker-main-container .goog-tree-row {padding: 2px 0px 3px 8px; vertical-a=
lign: middle; cursor: default; white-space: nowrap; height: 15px;}
..picker-main-container .goog-tree-item-label {overflow: hidden; white-space=
: nowrap; empty-cells: show; font-size: 13px; font-weight: normal; font-fam=
ily: Roboto,Arial,sans-serif; width: 95%;}
..picker-main-container .goog-tree-expand-icon {background-repeat: no-repeat=
; height: 12px; width: 12px; cursor: pointer; vertical-align: middle;}
..picker-main-container .goog-tree-expand-icon-minus ,.picker-main-container=
.goog-tree-expand-icon-lminus ,.picker-main-container .goog-tree-expand-ic=
on-tminus {background-image: url("//ssl.gstatic.com/docs/picker/images/icon=
s-v9.png"); background-position: -402px center;}
..picker-main-container .goog-tree-expand-icon-plus ,.picker-main-container =
..goog-tree-expand-icon-tplus ,.picker-main-container .goog-tree-expand-icon=
-lplus {background-image: url("//ssl.gstatic.com/docs/picker/images/icons-v=
9.png"); background-position: -384px center;}
..picker-main-container .goog-tree-expand-icon-blank {background-position: c=
enter center; background-repeat: no-repeat; height: 8px;}
..picker-content .goog-tree-root {min-height: 200px; max-height: 300px; over=
flow: auto; border: 1px solid rgb(217, 217, 217);}
..picker-treedoclistview-node-name {font-size: 13px; padding: 2px 3px 3px; f=
ont-weight: normal; vertical-align: middle;}
..picker-treedoclistview-node-message {color: rgb(102, 102, 102); padding-le=
ft: 4px;}
..picker-treedoclistview-node-error {color: rgb(204, 51, 51); padding-left: =
4px;}
..picker-upload {overflow-y: auto; padding: 20px;}
..picker-upload .picker-dataview ,.picker-upload .picker-dropzone {transitio=
n: top 0.218s ease 0s;}
* html .picker-upload ,body .picker-upload {height: 100%; width: 100%;}
..apps-upload-sprite {background-image: url("//ssl.gstatic.com/docs/picker/i=
mages/apps_upload_icons-v1.gif") !important;}
..picker-upload-container.picker-collapsed .picker-upload-button ,.picker-up=
load-container.picker-collapsed .picker-upload-header ,.picker-upload-conta=
iner.picker-collapsed .picker-upload-text {display: none;}
..picker-upload-container.picker-collapsed .upload-uploader-flash-content {p=
osition: absolute; top: -1000px !important; left: -1000px !important;}
..picker-upload-header {font-size: 13px; font-weight: bold; color: rgb(68, 6=
8, 68); margin-bottom: 4px;}
..upload-file-col {padding: 4px;}
..upload-state-default .upload-file-col {padding: 2px;}
..upload-file {border-bottom: 0px none;}
..upload-file .goog-flat-button {color: rgb(153, 153, 153); text-decoration:=
underline; cursor: pointer; margin-right: 5px;}
..upload-file-progress {display: none;}
..upload-file-status {width: 16px; background-position: 20px 20px; backgroun=
d-repeat: no-repeat;}
..upload-state-start .upload-file-status ,.upload-state-upload .upload-file-=
status ,.upload-state-backoff .upload-file-status {width: 16px; height: 16p=
x; background-position: center top;}
..upload-state-complete .upload-file-status {width: 16px; height: 13px; back=
ground-position: center -16px;}
..upload-state-error .upload-file-status {width: 16px; height: 13px; backgro=
und-position: center -31px;}
..upload-state-default .progress-bar-horizontal ,.upload-state-inqueue .prog=
ress-bar-horizontal ,.upload-state-error .progress-bar-horizontal ,.upload-=
state-complete .progress-bar-horizontal ,.upload-state-cancel .upload-file-=
size ,.upload-state-cancel .upload-file-progress ,.upload-state-cancel .upl=
oad-file-actions ,.upload-state-error .upload-file-size {display: none;}
..upload-file-size {text-align: right;}
..upload-file-progress {width: 88px;}
..upload-file-message {font-size: 11px; padding-left: 0.5em; color: rgb(153,=
153, 153);}
..upload-message .progress-bar-horizontal {display: none;}
..upload-file-actions {text-align: right;}
..upload-file-hidden {visibility: hidden; cursor: auto;}
..picker-upload-text {color: rgb(102, 102, 102); font-size: 10px; margin: 5p=
x 0px 4px;}
..picker-upload-text-a {color: rgb(153, 153, 153);}
..upload-uploader {font-size: 13px;}
..upload-uploader-table {width: auto;}
..picker-upload.picker-videoupload {padding: 0px;}
..picker-videoupload .upload-uploader-table {width: 100%;}
..upload-uploader-file-list {width: auto;}
..upload-uploader-hidden {display: none !important;}
..picker-upload-input-flash {font-size: 11px;}
..picker-upload-input-noflash {padding: 8px; font-size: 11px;}
..picker-upload-input-flash {border-top: 1px solid rgb(221, 221, 221); borde=
r-left: 1px solid rgb(221, 221, 221); background-color: rgb(245, 245, 245);=
padding: 4px 11px 2px; margin: 8px; text-align: center; vertical-align: mi=
ddle;}
..picker-upload-input-flash .picker-spr-upload-arrow {margin-right: 5px;}
..picker-upload-input-noflash .upload-uploader-input {font-size: 9px;}
..picker-docsuploadview .picker-upload-header {font-weight: normal; color: r=
gb(0, 0, 0);}
..picker-docsuploadview-title {font-weight: bold; color: rgb(68, 68, 68); ma=
rgin-bottom: 10px; font-size: 13px;}
..picker-doplaruploadview-uploading ,.picker-geouploadview-uploading {font-s=
ize: 13px; margin: 10px;}
..picker-doplaruploadview-error ,.picker-geouploadview-error {font-size: 13p=
x; margin: 10px; color: rgb(204, 51, 51);}
..picker-docsuploadview-checkbox {font-size: 12px; margin: 15px 0px 0px -4px=
;}
..picker-docsuploadview-checkbox-input {margin-right: 7px;}
..picker-docsuploadview-move-to-folder {font-size: 13px; margin: 0px 0px 10p=
x 27px;}
..picker-docsuploadview-folder-header {margin-top: 10px;}
..picker-docsuploadview-icon {background-image: url("//ssl.gstatic.com/docs/=
picker/images/folder_sprite-v1.gif"); background-position: -24px 0px; heigh=
t: 16px; vertical-align: middle; width: 16px;}
..picker-du-folder-icon {height: 11px; vertical-align: middle; width: 11px; =
margin: -1px 0px 0px 5px;}
..picker-docsuploadview-icon {margin-bottom: 3px;}
..picker-docsuploadview-spacing {width: 5px;}
..picker-du-folders-popup {border: 1px solid rgb(221, 221, 221); padding: 13=
px; font-size: 12px; width: 300px; color: rgb(0, 0, 0); background-color: r=
gb(255, 255, 255); position: absolute; z-index: 20; margin: -3px 0px 0px 2p=
x;}
..picker-docsuploadview-dropdown {background-image: url("//ssl.gstatic.com/d=
ocs/picker/images/folder_sprite-v1.gif"); background-position: -40px 0px; w=
idth: 12px; height: 16px; vertical-align: middle; margin: 0px -2px 3px 3px;=
}
..picker-docsuploadview .goog-tree-root {height: 125px; overflow-x: hidden; =
overflow-y: auto;}
..picker-videos-listview .picker-dataview-content {padding: 15px;}
..picker-video-control {border: 5px solid transparent; cursor: pointer; marg=
in: 5px; padding: 2px;}
..picker-video-control-checked {border: 5px solid rgb(77, 144, 254); backgro=
und: rgb(245, 245, 245) none repeat scroll 0% 0%;}
..picker-videoupload .picker-video-control-checked {border: 5px solid rgb(25=
5, 255, 255); background: rgb(255, 255, 255) none repeat scroll 0% 0%;}
..picker-video-control-inner {overflow: hidden;}
..picker-video-control-preview {padding: 1px; border: 1px solid rgb(153, 153=
, 153);}
..picker-video-control-thumb {z-index: 3; width: 96px; height: 72px; cursor:=
pointer;}
..picker-video-control-thumb-img {width: 96px; height: 72px; cursor: pointer=
;}
..picker-photos-upload .picker-video-control-thumb ,.picker-photos-upload .p=
icker-video-control-thumb-img {width: 240px; height: 182px;}
..picker-video-control-previewing .picker-video-control-thumb {display: none=
;}
..picker-video-control-star-mask {width: 55px; height: 11px; margin-right: 7=
px; overflow: hidden; vertical-align: middle; line-height: 9pt;}
..picker-video-control-star-mask .picker-spr-video-stars {position: relative=
;}
..picker-video-control .picker-spr-video-play-overlay {position: relative; z=
-index: 2; top: -50%; left: 50%; margin-left: -18px; margin-top: -20px;}
..picker-video-control-metadata {margin-left: 4px;}
..picker-video-control-previewing .picker-video-control-metadata {padding-to=
p: 3px;}
..picker-video-control-title {font-size: 13px; font-weight: bold; color: rgb=
(80, 80, 80); white-space: nowrap; text-overflow: ellipsis; height: 1.3em; =
overflow: hidden;}
..picker-video-control-previewing .picker-video-control-title {font-size: 12=
px;}
..picker-video-control-content {font-size: 12px; height: 3em; line-height: 1=
..5em; margin-bottom: -2px; overflow: hidden; overflow-wrap: break-word;}
..picker-video-control-time {color: rgb(133, 133, 133); font-size: 12px; ver=
tical-align: middle;}
..picker-video-control-previewing .picker-video-control-time {font-size: 11p=
x;}
..picker-video-control-publisher {color: rgb(0, 128, 0); font-size: 12px;}
..picker-video-control-previewing .picker-video-control-publisher {font-size=
: 11px;}
..picker-spr-youtube {margin: 0px 13px 6px 0px;}
..picker-videos-grid .picker-dataview-content {padding-left: 20px;}
..picker-videos-grid .picker-video-grid-control-border {opacity: 0; transiti=
on: opacity 0.218s ease 0s; padding: 5px; position: relative;}
..picker-video-grid-control-checked .picker-video-grid-control-border {borde=
r: 5px solid rgb(66, 133, 244); padding: 0px;}
..picker-video-grid-control-focused .picker-video-grid-control-border {outli=
ne: 1px solid rgb(66, 133, 244);}
..picker-videos-grid .picker-video-grid-control-wrapper {cursor: pointer; di=
splay: inline-block; height: 140px; outline: medium none; text-align: cente=
r; vertical-align: middle; width: 140px;}
..picker-videos-grid .picker-video-grid-control-thumbnail {max-height: 100%;=
max-width: 100%;}
..picker-videos-grid .picker-video-grid-control-hover .picker-video-grid-con=
trol-check {opacity: 0.7;}
..picker-videos-grid .picker-video-grid-control-checked .picker-video-grid-c=
ontrol-check {opacity: 1; left: 5px; top: 5px;}
..picker-videos-grid .picker-video-grid-control-check {opacity: 0; transitio=
n: opacity 0.218s ease 0s; left: 10px; position: absolute; top: 10px; z-ind=
ex: 2104;}
..picker-videos-grid .picker-spr-rio-checkmark-selected {animation: 0.3s lin=
ear 0s normal none 1 running pickerPhotosSelectionOverlayCheckmarkSelectedT=
ransition;}
..picker-video-control-disabled ,.picker-video-grid-control-disabled ,.picke=
r-video-grid-control-unselectable {opacity: 0.3;}
..picker-video-grid-control-unselectable .picker-video-grid-control-check {d=
isplay: none;}
..picker-video-duration-overlay {background: rgb(0, 0, 0) none repeat scroll=
0% 0%; bottom: 5px; color: rgb(255, 255, 255); font-size: 11px; font-weigh=
t: bold; height: 14px; line-height: 14px; opacity: 0.75; padding: 0px 4px; =
position: absolute; right: 5px; vertical-align: top; z-index: 2104;}
..picker-videos-grid .picker-video-grid-control-checked .picker-video-durati=
on-overlay {opacity: 1; bottom: 0px; right: 0px;}
..picker-video-grid-control-title {display: block; font-size: 13px; position=
: relative; height: 13px; line-height: 13px; margin: 2px 0px; overflow: hid=
den; text-align: center; text-overflow: ellipsis; white-space: nowrap;}
..picker-video-grid-control-timestamp {color: rgb(153, 153, 153); display: b=
lock; position: relative; font-size: 11px; height: 11px; line-height: 11px;=
margin: 2px 0px; text-align: center;}
..picker-videos-grid .picker-video-grid-control-preview {display: inline-blo=
ck; margin: 10px; outline: medium none;}
..picker-videos-grid .picker-spr-video-play-overlay {opacity: 0.8; left: 0px=
; top: 0px;}
..picker-video-grid-control-hover .picker-spr-video-play-overlay {opacity: 1=
;}
..picker-video-grid-control-checked .picker-spr-video-play-overlay {opacity:=
1; left: -5px; top: -5px;}
..upload-uploader .picker-photos-upload .progress-bar-horizontal {width: aut=
o; height: 5px; border: medium none; margin: 3px; padding: 0px; background:=
transparent none repeat scroll 0% 0%;}
..upload-uploader .picker-photos-upload .progress-bar-thumb {background: rgb=
(136, 136, 136) none repeat scroll 0% 0%; height: 100%;}
..picker-photos-upload-progress {position: absolute !important; bottom: 3px;=
left: 0px; width: 100%;}
..picker-photos-upload-controls {position: absolute !important; bottom: 3px;=
left: 0px; width: 100%; background: rgb(215, 0, 0) none repeat scroll 0% 0=
%; color: rgb(255, 255, 255);}
..picker-photos-upload-actions {text-decoration: underline; cursor: pointer;=
margin: 5px;}
..picker-photos-upload-message {margin: 5px;}
..picker-videos-upload .picker-video-control {cursor: auto;}
..picker-photos-upload-filename ,.picker-videos-upload-loadingthumb {color: =
rgb(153, 153, 153); background: transparent url("//ssl.gstatic.com/docs/pic=
ker/images/placeholder-v1.gif") repeat scroll 0% 0%;}
..picker-videos-upload-error .picker-videos-upload-loadingthumb {background:=
rgb(215, 0, 0) none repeat scroll 0% 0%;}
..picker-videos-upload-loadingthumb {width: 240px; height: 180px;}
..picker-photos-upload-filename {padding-top: 5px; height: 115px; width: 160=
px;}
..picker-videos-upload-metadata {vertical-align: top; width: 100%;}
..picker-videos-upload-processing {font-size: 12px; color: rgb(170, 170, 170=
);}
..picker-videos-upload-error {font-size: 12px; color: rgb(204, 51, 51);}
..upload-state-complete .picker-photos-upload-filename {background-color: rg=
b(245, 245, 245);}
..picker-photos-upload-rotating ,.upload-state-complete .picker-photos-uploa=
d-filename .picker-photos-upload-loading-icon ,.upload-state-complete .pick=
er-videos-upload-loadingthumb .picker-videos-upload-loading-icon {position:=
absolute !important; top: 50%; left: 50%; background-image: url("//ssl.gst=
atic.com/docs/picker/images/loading-32-v1.gif") !important; height: 32px; w=
idth: 32px; margin: -16px 0px 0px -16px; opacity: 0.3;}
..picker-videos-upload-error.upload-state-complete .picker-videos-upload-loa=
dingthumb .picker-videos-upload-loading-icon {display: none;}
..picker-videos-upload-loadingthumb .picker-videos-upload-loading-icon {posi=
tion: relative !important;}
..upload-state-default .picker-photos-upload-controls ,.upload-state-start .=
picker-photos-upload-controls ,.upload-state-cancel .picker-photos-upload-c=
ontrols ,.upload-state-complete .picker-photos-upload-controls ,.upload-sta=
te-upload .picker-photos-upload-controls ,.upload-state-inqueue .picker-pho=
tos-upload-controls {display: none;}
..picker-videos-upload-control {margin: 2px; border: 6px solid rgb(255, 255,=
255);}
..picker-videos-upload-preview {height: 182px; overflow: hidden; padding: 1p=
x; margin-right: 4px; border: 1px solid rgb(153, 153, 153); position: relat=
ive;}
..picker-photos-upload-preview {opacity: 0.8; overflow: hidden;}
..picker-photos-upload-preview .uploader-thumb-img {border: 1px solid rgb(10=
2, 102, 102); position: relative;}
..picker-photos-upload-description {color: rgb(153, 153, 153); width: 100%; =
height: 1.2em; overflow: hidden; text-align: center; text-overflow: ellipsi=
s; white-space: nowrap; position: absolute;}
..picker-videoupload .upload-state-complete .picker-photos-upload-preview .u=
ploader-thumb-img {border: 1px solid rgb(192, 192, 192); position: relative=
;}
..picker-videoupload .upload-state-complete .picker-photos-upload-preview {o=
pacity: 1; overflow: visible;}
..picker-videoupload .upload-state-default .progress-bar-horizontal ,.picker=
-videoupload .upload-state-inqueue .progress-bar-horizontal ,.picker-videou=
pload .upload-state-error .progress-bar-horizontal ,.picker-videoupload .up=
load-state-cancel .progress-bar-horizontal ,.picker-videoupload .upload-sta=
te-complete .progress-bar-horizontal {display: none;}
..photo-zoomview {position: relative; z-index: 2105;}
:first-child + html .photo-zoomview {background-color: rgb(255, 255, 255); =
padding-top: 3px;}
..picker-zoomview-image {background: rgb(255, 255, 255) none repeat scroll 0=
% 0%; margin: 0px 3px; padding-top: 22px;}
..photo-loading .photo-loading-indicator {display: block; font-size: 20pt; f=
ont-weight: bold; font-family: Roboto,Arial,sans-serif; text-align: center;=
width: 100%; position: absolute; top: 0px; margin: 1em;}
..scaledimage-onscreenpane {display: inline-block; position: relative;}
..upload-uploader-file-grid {margin: 10px 5px 0px;}
..picker-photos-welcome {bottom: 10px;}
..picker-photos-welcome-text {font-size: 13px; padding-left: 15px;}
..picker-photos-welcome-section {padding: 15px 15px 0px;}
..picker-photos-welcome-line {border-bottom: 1px solid rgb(221, 221, 221); p=
adding-top: 20px;}
..picker-photos-welcome-link {color: rgb(153, 153, 153);}
..picker-photos-welcome-icon-top {vertical-align: top;}
..picker-photos-welcome-desc {margin: 10px 0px 20px; font-size: 12px;}
..picker-photos-welcome-source-link {font-weight: bold; color: rgb(17, 85, 2=
04); cursor: pointer;}
..picker-photos-welcome-title {font-weight: bold; color: rgb(0, 0, 0);}
..picker-main-container .picker-photos-welcome .goog-imageless-button {font-=
weight: bold; color: rgb(34, 34, 34);}
..picker-html5-video {background: rgb(0, 0, 0) none repeat scroll 0% 0%;}
..picker-video-upload-processing ,.video-upload-box .picker-photo-control-lo=
ading {height: 270px; width: 360px; background-color: rgb(238, 238, 238);}
..picker-videosgrid .picker-photo-control {margin-top: 20px; margin-left: 20=
px;}
..picker-video-processing-text {position: absolute; bottom: 5px; left: 0px; =
right: 0px; height: 20px; text-align: center; z-index: 2109; opacity: 0.8; =
color: rgb(153, 153, 153); font-size: 12px;}
..picker-video-upload-spinner {z-index: 2109; background-image: url("//ssl.g=
static.com/docs/picker/images/loading-v1.gif"); height: 16px; width: 16px; =
opacity: 0.5; position: absolute; top: 50%; margin-top: -20px; left: 50%; m=
argin-left: -8px;}
..video-upload-box .picker-upload-filename-inner ,.video-upload-box-error .p=
icker-upload-filename-inner ,.picker-video-upload-filename {position: absol=
ute; top: 50%; margin-top: 3px; text-align: center; padding-top: 0px; z-ind=
ex: 2104; height: 14px; width: 120px; text-overflow: ellipsis; white-space:=
nowrap; overflow: hidden; font-size: 12px; color: rgb(153, 153, 153);}
..video-upload-box .picker-spr-video-upload-icon {opacity: 0.5; position: ab=
solute; top: 50%; margin-top: -20px; left: 50%; margin-left: -11px;}
..video-upload-box .picker-photos-upload-filename {background-color: rgb(238=
, 238, 238); background-image: none;}
..video-upload-box .picker-photos-upload-controls {display: none;}
..picker-videosgrid .picker-photo-control-focused ,.picker-videosgrid .picke=
r-photo-control-focused.picker-photo-control ,.picker-videosgrid .picker-ph=
oto-control ,.picker-videosgrid .picker-photo-control.picker-photo-control-=
focused {outline: medium none; border: medium none;}
..picker-remove-video-single {position: relative; margin-left: 600px; margin=
-top: 10px; cursor: pointer;}
..video-upload-box .progress-bar-horizontal {right: 0px; bottom: 0px; left: =
0px; height: 8px; border: 1px solid rgb(153, 153, 153); margin: 0px 8px 8px=
; padding: 1px; background: rgb(255, 255, 255) none repeat scroll 0% 0%; z-=
index: 2109;}
..video-upload-box .progress-bar-thumb {height: 100%; background-repeat: rep=
eat-x; background-size: 20px 10px; background-color: rgb(204, 204, 204); ba=
ckground-attachment: scroll; background-image: linear-gradient(315deg, tran=
sparent, transparent 33%, rgba(0, 0, 0, 0.12) 33%, rgba(0, 0, 0, 0.12) 66%,=
transparent 66%, transparent); animation-duration: 0.8s; animation-iterati=
on-count: infinite; animation-timing-function: linear;}
..video-upload-box .picker-spr-close-box-small-off {position: absolute; opac=
ity: 0.5; cursor: pointer; z-index: 2109; top: 5px; right: 5px;}
..video-upload-box .picker-spr-upload-error {position: absolute; top: 50%; m=
argin-top: -20px; left: 50%; margin-left: -8px;}
..picker-videosgrid .picker-edit-toolbar {display: none;}
..picker-videomsgbar.picker-msgbar.jfk-butterBar {width: 180px; z-index: 220=
0 !important;}
..picker-videosgrid .picker-photo-control-preview.picker-video-player {z-ind=
ex: 2103;}
..picker-videosgrid .new-upload-box-error .picker-photos-error-text {bottom:=
0px;}
..picker-html5-player-wrapper ,.picker-video-thumbnail {position: absolute; =
top: 0px; bottom: 0px; left: 0px; right: 0px;}
..picker-ribbon-wrapper {overflow: hidden; position: absolute; top: -3px; le=
ft: -3px; width: 85px; height: 88px;}
..picker-ribbon {position: relative; padding: 6px 0px; left: -24px; top: 24p=
x; width: 120px; font-size: 10px; font-weight: bold; color: rgb(255, 255, 2=
55); text-align: center; text-shadow: 0px 2px 0px rgba(0, 0, 0, 0.5); text-=
transform: uppercase; opacity: 0.9; transform: rotate(-45deg); background-c=
olor: rgb(170, 0, 0); background-image: -moz-linear-gradient(center top , r=
gb(255, 0, 0), rgb(170, 0, 0)); box-shadow: 0px 0px 3px rgba(0, 0, 0, 0.3);=
}
..goog-inline-block {position: relative; display: inline-block;}
* html .goog-inline-block ,:first-child + html .goog-inline-block ,body .go=
og-inline-block {display: inline;}
..jfk-button {border-radius: 2px; cursor: default; font-size: 11px; font-wei=
ght: bold; text-align: center; white-space: nowrap; margin-right: 16px; hei=
ght: 27px; line-height: 27px; min-width: 54px; outline: 0px none; padding: =
0px 8px;}
..jfk-button-hover {box-shadow: 0px 1px 1px rgba(0, 0, 0, 0.1);}
..jfk-button-selected {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..jfk-button .jfk-button-img {margin-top: -3px; vertical-align: middle;}
..jfk-button-label {margin-left: 5px;}
..jfk-button-narrow {min-width: 34px; padding: 0px;}
..jfk-button-collapse-left ,.jfk-button-collapse-right {z-index: 1;}
..jfk-button-collapse-left.jfk-button-disabled {z-index: 0;}
..jfk-button-checked.jfk-button-collapse-left ,.jfk-button-checked.jfk-butto=
n-collapse-right {z-index: 2;}
..jfk-button-collapse-left:focus ,.jfk-button-collapse-right:focus ,.jfk-but=
ton-hover.jfk-button-collapse-left ,.jfk-button-hover.jfk-button-collapse-r=
ight {z-index: 3;}
..jfk-button-collapse-left {margin-left: -1px; border-bottom-left-radius: 0p=
x; border-top-left-radius: 0px;}
..jfk-button-collapse-right {margin-right: 0px; border-top-right-radius: 0px=
; border-bottom-right-radius: 0px;}
..jfk-button.jfk-button-disabled:active {box-shadow: none;}
..jfk-button-action {box-shadow: none; background-color: rgb(77, 144, 254); =
background-image: -moz-linear-gradient(center top , rgb(77, 144, 254), rgb(=
71, 135, 237)); border: 1px solid rgb(48, 121, 237); color: rgb(255, 255, 2=
55);}
..jfk-button-action.jfk-button-hover {box-shadow: none; background-color: rg=
b(53, 122, 232); background-image: -moz-linear-gradient(center top , rgb(77=
, 144, 254), rgb(53, 122, 232)); border: 1px solid rgb(47, 91, 183);}
..jfk-button-action:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) in=
set; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, 0)=
;}
..jfk-button-action.jfk-button-clear-outline {box-shadow: none; outline: med=
ium none;}
..jfk-button-action:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inset=
; background: rgb(53, 122, 232) none repeat scroll 0% 0%; border: 1px solid=
rgb(47, 91, 183);}
..jfk-button-action.jfk-button-disabled {background: rgb(77, 144, 254) none =
repeat scroll 0% 0%; opacity: 0.5;}
..jfk-button-contrast {box-shadow: none; background-color: rgb(245, 245, 245=
); background-image: -moz-linear-gradient(center top , rgb(245, 245, 245), =
rgb(241, 241, 241)); color: rgb(68, 68, 68); border: 1px solid rgba(0, 0, 0=
, 0.1);}
..jfk-button-contrast.jfk-button-hover ,.jfk-button-contrast.jfk-button-clea=
r-outline.jfk-button-hover {box-shadow: none; background-color: rgb(248, 24=
8, 248); background-image: -moz-linear-gradient(center top , rgb(248, 248, =
248), rgb(241, 241, 241)); border: 1px solid rgb(198, 198, 198); color: rgb=
(51, 51, 51);}
..jfk-button-contrast:active ,.jfk-button-contrast.jfk-button-hover:active {=
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; background: rgb(248, 248,=
248) none repeat scroll 0% 0%;}
..jfk-button-contrast.jfk-button-selected ,.jfk-button-contrast.jfk-button-c=
lear-outline.jfk-button-selected {background-color: rgb(238, 238, 238); bac=
kground-image: -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(24=
1, 241, 241)); border: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51)=
;}
..jfk-button-contrast.jfk-button-checked ,.jfk-button-contrast.jfk-button-cl=
ear-outline.jfk-button-checked {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) =
inset; background-color: rgb(238, 238, 238); background-image: -moz-linear-=
gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1px =
solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..jfk-button-contrast:focus {border: 1px solid rgb(77, 144, 254); outline: m=
edium none;}
..jfk-button-contrast.jfk-button-clear-outline {border: 1px solid rgb(220, 2=
20, 220); outline: medium none;}
..jfk-button-contrast.jfk-button-disabled {background: rgb(255, 255, 255) no=
ne repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(1=
84, 184, 184);}
..jfk-button-contrast .jfk-button-img {opacity: 0.55;}
..jfk-button-contrast.jfk-button-checked .jfk-button-img ,.jfk-button-contra=
st.jfk-button-selected .jfk-button-img ,.jfk-button-contrast.jfk-button-hov=
er .jfk-button-img {opacity: 0.9;}
..jfk-button-contrast.jfk-button-disabled .jfk-button-img {opacity: 0.333;}
..jfk-button-default {box-shadow: none; background-color: rgb(61, 148, 0); b=
ackground-image: -moz-linear-gradient(center top , rgb(61, 148, 0), rgb(57,=
138, 0)); border: 1px solid rgb(41, 105, 29); color: rgb(255, 255, 255); t=
ext-shadow: 0px 1px rgba(0, 0, 0, 0.1);}
..jfk-button-default.jfk-button-hover {box-shadow: none; background-color: r=
gb(54, 130, 0); background-image: -moz-linear-gradient(center top , rgb(61,=
148, 0), rgb(54, 130, 0)); border: 1px solid rgb(45, 98, 0); text-shadow: =
0px 1px rgba(0, 0, 0, 0.3);}
..jfk-button-default:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) i=
nset; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, 0=
);}
..jfk-button-default.jfk-button-clear-outline {box-shadow: none; outline: me=
dium none;}
..jfk-button-default:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inse=
t; background: rgb(54, 130, 0) none repeat scroll 0% 0%; border: 1px solid =
rgb(45, 98, 0);}
..jfk-button-default.jfk-button-disabled {background: rgb(61, 148, 0) none r=
epeat scroll 0% 0%; opacity: 0.5;}
..jfk-button-primary {box-shadow: none; background-color: rgb(209, 72, 54); =
background-image: -moz-linear-gradient(center top , rgb(221, 75, 57), rgb(2=
09, 72, 54)); border: 1px solid transparent; color: rgb(255, 255, 255); tex=
t-shadow: 0px 1px rgba(0, 0, 0, 0.1); text-transform: uppercase;}
..jfk-button-primary.jfk-button-hover {box-shadow: 0px 1px 1px rgba(0, 0, 0,=
0.2); background-color: rgb(197, 55, 39); background-image: -moz-linear-gr=
adient(center top , rgb(221, 75, 57), rgb(197, 55, 39)); border-width: 1px;=
border-style: solid; border-color: rgb(176, 40, 26) rgb(176, 40, 26) rgb(1=
75, 48, 31); -moz-border-top-colors: none; -moz-border-right-colors: none; =
-moz-border-bottom-colors: none; -moz-border-left-colors: none; border-imag=
e: none;}
..jfk-button-primary:focus {box-shadow: 0px 0px 0px 1px rgb(255, 255, 255) i=
nset; border: 1px solid rgba(0, 0, 0, 0); outline: 0px none rgba(0, 0, 0, 0=
);}
..jfk-button-primary.jfk-button-clear-outline {box-shadow: none; outline: me=
dium none;}
..jfk-button-primary:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.3) inse=
t; background-color: rgb(176, 40, 26); background-image: -moz-linear-gradie=
nt(center top , rgb(221, 75, 57), rgb(176, 40, 26)); border: 1px solid rgb(=
153, 42, 27);}
..jfk-button-primary.jfk-button-disabled {background: rgb(209, 72, 54) none =
repeat scroll 0% 0%; opacity: 0.5;}
..jfk-slideToggle {border-radius: 2px; box-shadow: 0px 1px 2px 0px rgba(0, 0=
, 0, 0.1) inset; background-color: rgb(245, 245, 245); background-image: -m=
oz-linear-gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); bo=
rder: 1px solid rgb(204, 204, 204); color: rgb(102, 102, 102); font-weight:=
bold; height: 27px; line-height: 27px; margin-right: 16px; outline: medium=
none; overflow: hidden; padding: 0px; position: relative; width: 94px;}
..jfk-slideToggle-on ,.jfk-slideToggle-off ,.jfk-slideToggle-thumb {display:=
inline-block; text-align: center; text-transform: uppercase; width: 47px;}
..jfk-slideToggle-on {box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1) inset; =
background-color: rgb(57, 139, 242); background-image: -moz-linear-gradient=
(center top , rgb(59, 147, 255), rgb(54, 137, 238)); color: rgb(255, 255, 2=
55); height: 27px;}
..jfk-slideToggle-off {border-radius: 2px 2px 0px 0px;}
..jfk-slideToggle-thumb {box-shadow: 0px 1px 2px 0px rgba(0, 0, 0, 0.1); bac=
kground-color: rgb(245, 245, 245); background-image: -moz-linear-gradient(c=
enter top , rgb(248, 248, 248), rgb(241, 241, 241)); transition: all 0.13s =
ease-out 0s; border: 1px solid rgb(204, 204, 204); display: block; height: =
27px; left: -1px; position: absolute; top: -1px;}
..jfk-slideToggle-thumb::after {content: ""; background-image: -moz-linear-g=
radient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-linear=
-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-line=
ar-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-li=
near-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%), -moz-=
linear-gradient(left center , rgb(204, 204, 204) 50%, transparent 50%); bac=
kground-position: 0px 0px, 0px 2px, 0px 4px, 0px 6px, 0px 8px; background-r=
epeat: repeat-x; background-size: 2px 1px; display: block; height: 9px; lef=
t: 15px; position: absolute; top: 9px; width: 17px;}
..jfk-slideToggle.jfk-slideToggle-checked .jfk-slideToggle-thumb {left: 47px=
;}
..jfk-slideToggle:focus {border: 1px solid rgb(77, 144, 254);}
..jfk-slideToggle.jfk-slideToggle-clearOutline {border: 1px solid rgb(204, 2=
04, 204);}
..jfk-button-standard {box-shadow: none; background-color: rgb(245, 245, 245=
); background-image: -moz-linear-gradient(center top , rgb(245, 245, 245), =
rgb(241, 241, 241)); color: rgb(68, 68, 68); border: 1px solid rgba(0, 0, 0=
, 0.1);}
..jfk-button-standard.jfk-button-hover ,.jfk-button-standard.jfk-button-clea=
r-outline.jfk-button-hover {box-shadow: none; background-color: rgb(248, 24=
8, 248); background-image: -moz-linear-gradient(center top , rgb(248, 248, =
248), rgb(241, 241, 241)); border: 1px solid rgb(198, 198, 198); color: rgb=
(51, 51, 51);}
..jfk-button-standard:active ,.jfk-button-standard.jfk-button-hover:active {=
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; background: rgb(248, 248,=
248) none repeat scroll 0% 0%; color: rgb(51, 51, 51);}
..jfk-button-standard.jfk-button-selected ,.jfk-button-standard.jfk-button-c=
lear-outline.jfk-button-selected {background-color: rgb(238, 238, 238); bac=
kground-image: -moz-linear-gradient(center top , rgb(248, 248, 248), rgb(24=
1, 241, 241)); border: 1px solid rgb(204, 204, 204); color: rgb(51, 51, 51)=
;}
..jfk-button-standard.jfk-button-checked ,.jfk-button-standard.jfk-button-cl=
ear-outline.jfk-button-checked {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) =
inset; background-color: rgb(238, 238, 238); background-image: -moz-linear-=
gradient(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1px =
solid rgb(204, 204, 204); color: rgb(51, 51, 51);}
..jfk-button-standard:focus {border: 1px solid rgb(77, 144, 254); outline: m=
edium none;}
..jfk-button-standard.jfk-button-clear-outline {border: 1px solid rgba(0, 0,=
0, 0.1); outline: medium none;}
..jfk-button-standard.jfk-button-disabled {background: rgb(255, 255, 255) no=
ne repeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(1=
84, 184, 184);}
..jfk-button-standard .jfk-button-img {opacity: 0.55;}
..jfk-button-standard.jfk-button-checked .jfk-button-img ,.jfk-button-standa=
rd.jfk-button-selected .jfk-button-img ,.jfk-button-standard.jfk-button-hov=
er .jfk-button-img {opacity: 0.9;}
..jfk-button-standard.jfk-button-disabled .jfk-button-img {opacity: 0.333;}
..jfk-button-flat {border-radius: 0px; border: 1px solid transparent; font-s=
ize: 13px; font-weight: normal; height: 21px; line-height: 21px; margin-rig=
ht: 1px; min-width: 0px; padding: 0px;}
..jfk-button-flat.jfk-button-hover ,.jfk-button-flat.jfk-button-selected ,.j=
fk-button-flat:focus ,.jfk-button-flat:active {box-shadow: none;}
..jfk-button-flat .jfk-button-img {height: 21px; opacity: 0.55; width: 21px;=
}
..jfk-button-flat .jfk-button-label {display: inline-block; margin: 0px; pad=
ding: 0px 1px;}
..jfk-button-flat.jfk-button-selected .jfk-button-img ,.jfk-button-flat.jfk-=
button-hover .jfk-button-img {opacity: 0.9;}
..jfk-button-flat.jfk-button-disabled .jfk-button-img {opacity: 0.333;}
..jfk-button-flat:focus {border: 1px solid rgb(77, 144, 254);}
..jfk-button-flat.jfk-button-clear-outline {border: 1px solid transparent;}
..jfk-button-mini {background-color: rgb(245, 245, 245); background-image: -=
moz-linear-gradient(center top , rgb(245, 245, 245), rgb(241, 241, 241)); b=
order: 1px solid rgba(0, 0, 0, 0.1); color: rgb(68, 68, 68); height: 17px; =
line-height: 17px; min-width: 22px; text-shadow: 0px 1px rgba(0, 0, 0, 0.1)=
;}
..jfk-button-mini.jfk-button-hover ,.jfk-button-mini.jfk-button-clear-outlin=
e.jfk-button-hover {background-color: rgb(248, 248, 248); background-image:=
-moz-linear-gradient(center top , rgb(248, 248, 248), rgb(241, 241, 241));=
border: 1px solid rgb(198, 198, 198); text-shadow: 0px 1px rgba(0, 0, 0, 0=
..3);}
..jfk-button-mini:active {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..jfk-button-mini.jfk-button-checked ,.jfk-button-mini.jfk-button-clear-outl=
ine.jfk-button-checked {box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; b=
ackground-color: rgb(224, 224, 224); background-image: -moz-linear-gradient=
(center top , rgb(238, 238, 238), rgb(224, 224, 224)); border: 1px solid rg=
b(204, 204, 204); color: rgb(51, 51, 51);}
..jfk-button-mini:focus {border: 1px solid rgb(77, 144, 254);}
..jfk-button-mini.jfk-button-clear-outline {border: 1px solid rgb(220, 220, =
220);}
..jfk-button-mini.jfk-button-disabled {background: rgb(255, 255, 255) none r=
epeat scroll 0% 0%; border: 1px solid rgba(0, 0, 0, 0.05); color: rgb(184, =
184, 184);}
..jfk-butterBar {border-radius: 2px; box-shadow: 0px 2px 4px rgba(0, 0, 0, 0=
..2); transition: all 0s linear 1s, opacity 1s ease 0s; border-style: solid;=
border-width: 0px; font-size: 11px; height: 0px; opacity: 0; visibility: h=
idden; overflow: hidden; padding: 0px; text-align: center;}
..jfk-butterBar-info {background-color: rgb(249, 237, 190); border-color: rg=
b(240, 195, 109); color: rgb(51, 51, 51);}
..jfk-butterBar-error {background-color: rgb(72, 72, 72); border-color: rgb(=
32, 32, 32); color: rgb(255, 255, 255);}
..jfk-butterBar-promo {background-color: rgb(214, 233, 248); border-color: r=
gb(77, 144, 240); color: rgb(51, 51, 51);}
..jfk-butterBar-warning {background-color: rgb(221, 75, 57); border-color: r=
gb(96, 32, 25); color: rgb(255, 255, 255);}
..jfk-butterBar-shown {transition: opacity 0.218s ease 0s; border-width: 1px=
; min-height: 14px; height: auto; opacity: 1; visibility: visible; padding:=
6px 16px;}
..jfk-butterBar-mini.jfk-butterBar-shown {padding: 2px 16px;}
..picker-dialog {background: rgb(255, 255, 255) none repeat scroll 0% 0%; bo=
rder: 1px solid rgb(172, 172, 172); position: absolute; box-shadow: 0px 4px=
16px rgba(0, 0, 0, 0.2); z-index: 1021; outline: medium none; padding: 0px=
;}
..picker.modal-dialog-content {width: 705px; height: 370px; padding: 0px; ma=
rgin: 0px; position: relative; border: 0px none;}
..picker.modal-dialog-bg {background: rgb(255, 255, 255) none repeat scroll =
0% 0%; left: 0px; position: absolute; top: 0px; z-index: 1001;}
..picker.modal-dialog-title ,.picker.modal-dialog-buttons {display: none;}
..picker-frame {width: 100%; height: 100%; border: 0px none; overflow: hidde=
n;}
..picker-upload-button-visible .picker-drag-drop-supported .picker-photos-up=
load-dropzone-cell {vertical-align: middle;}
..picker-photos-upload-dropzone td {text-align: center;}
..picker .progress-bar-thumb {background-color: rgb(93, 128, 239);}
..goog-inline-block {position: relative; display: inline-block;}
* html .goog-inline-block ,body .goog-inline-block {display: inline;}
:first-child + html .goog-inline-block {display: inline;}
..sketchy-dialog-bg ,.sketchy-dialog-fg {left: 0px; overflow: auto; position=
: absolute; top: 0px;}
..sketchy-dialog-bg {background-color: rgb(238, 238, 238); opacity: 0.75;}
..sketchy-dialog-fg {cursor: move;}
..sketchy-dialog {background-color: rgb(193, 217, 255); border: 1px solid rg=
b(58, 87, 116); padding: 8px; position: absolute; cursor: move;}
..sketchy-dialog-title {background-color: rgb(224, 237, 254); color: rgb(0, =
0, 0); font: bold 14px Arial,sans-serif; padding: 8px 15px 8px 8px; positio=
n: relative; vertical-align: middle;}
..sketchy-dialog-title-close {height: 24px; position: absolute; right: 8px; =
top: 4px; font-weight: normal; padding: 0px 6px;}
..sketchy-dialog-title-autosave {color: rgb(102, 102, 102); font: 12px Arial=
,sans-serif; position: absolute;}
..sketchy-dialog-content {background-color: rgb(255, 255, 255);}
..goog-tab-bar {margin: 0px; border: 0px none; padding: 0px; list-style: out=
side none none; cursor: default; outline: medium none; background: rgb(235,=
239, 249) none repeat scroll 0% 0%;}
..goog-tab-bar-clear {clear: both; height: 0px; overflow: hidden;}
..goog-tab-bar-start {float: left;}
..goog-tab-bar-end {float: right;}
* html .goog-tab-bar-start ,body .goog-tab-bar-start {margin-right: -3px;}
* html .goog-tab-bar-end ,body .goog-tab-bar-end {margin-left: -3px;}
div.tr_bubble {position: absolute;}
..tr_bubble_link {color: rgb(0, 0, 204); text-decoration: underline; cursor:=
pointer; font-size: 100%;}
..tr_bubble .tr_option-link ,.tr_bubble #tr_delete-image ,.tr_bubble #tr_mod=
ule-options-link {font-size: 83%;}
..tr_bubble .tr_body ,.tr_bubble .tr_t ,.tr_bubble .tr_l ,.tr_bubble .tr_r ,=
..tr_bubble .tr_b {background-color: rgb(224, 236, 255);}
..tr_bubble .tr_body {padding: 0px 19px 4px 4px; white-space: nowrap;}
..tr_bubble .tr_spacer {padding: 1px;}
..tr_bubble .tr_body ,.tr_bubble .tr_td ,.tr_bubble .tr_th {font-size: 83%; =
font-family: Arial,Helvetica,sans-serif;}
..tr_bubble .tr_tr ,.tr_bubble .tr_tl ,.tr_bubble .tr_bl ,.tr_bubble .tr_br =
{background-repeat: no-repeat; height: 0px; width: 2px;}
..tr_bubble .tr_tr {background-image: url("//ssl.gstatic.com/editor/bubble2_=
tr.gif");}
..tr_bubble .tr_tl {background-image: url("//ssl.gstatic.com/editor/bubble2_=
tl.gif");}
..tr_bubble .tr_bl {background-image: url("//ssl.gstatic.com/editor/bubble2_=
bl.gif");}
..tr_bubble .tr_br {background-image: url("//ssl.gstatic.com/editor/bubble2_=
br.gif");}
..tr_bubble .tr_t {border-top: 1px solid rgb(153, 192, 255);}
..tr_bubble .tr_b {border-bottom: 1px solid rgb(153, 192, 255);}
..tr_bubble .tr_l {border-left: 1px solid rgb(153, 192, 255);}
..tr_bubble .tr_r {border-right: 1px solid rgb(153, 192, 255);}
..tr_bubble .tr_tr ,.tr_bubble .tr_tl ,.tr_bubble .tr_bl ,.tr_bubble .tr_br =
,.tr_bubble .tr_b ,.tr_bubble .tr_t {line-height: 0; font-size: 1px;}
..tr_bubble_closebox {position: absolute; cursor: default; background: rgba(=
0, 0, 0, 0) url("//ssl.gstatic.com/editor/bubble_closebox.gif") no-repeat s=
croll left top; padding: 0px; margin: 0px; width: 10px; height: 10px; top: =
3px; right: 5px;}
div.tr_bubble_panel {padding: 2px 0px 1px;}
div.tr_bubble_panel_title {display: none;}
div.tr_multi_bubble div.tr_bubble_panel_title {margin-right: 1px; display: =
block; float: left; width: 50px;}
div.tr_multi_bubble div.tr_bubble_panel {padding: 2px 0px 1px; margin-right=
: 50px;}
..ee-content {width: 400px; height: 200px; overflow: auto; padding: 4px 8px;=
background: rgb(255, 255, 255) none repeat scroll 0% 0%; border: 1px solid=
rgb(51, 102, 153);}
..ee-tex {width: 388px; height: 60px; border: 1px solid rgb(0, 0, 0); margin=
-top: 4px; margin-bottom: 10px; display: block;}
..ee-preview-container {width: 380px; height: 80px; overflow: auto; border: =
1px solid rgb(204, 204, 204); padding: 4px;}
..editable a ,body a {cursor: text;}
..tr_well .tr_tl {background-image: url("//ssl.gstatic.com/editor/well_tl2.g=
if"); background-repeat: no-repeat;}
..tr_well .tr_t {background-image: url("//ssl.gstatic.com/editor/well_top2.g=
if"); background-repeat: repeat-x;}
..tr_well .tr_tr {background-image: url("//ssl.gstatic.com/editor/well_tr.gi=
f"); background-repeat: no-repeat;}
..tr_well .tr_l {background-image: url("//ssl.gstatic.com/editor/well_left.g=
if"); background-repeat: repeat-y;}
..tr_well .tr_r {background-image: url("//ssl.gstatic.com/editor/well_right.=
gif"); background-repeat: repeat-y;}
..tr_well .tr_r2 {background-image: url("//ssl.gstatic.com/editor/well_right=
2.gif"); background-repeat: repeat-y; background-position: right center;}
..tr_well .tr_bl {background-image: url("//ssl.gstatic.com/editor/well_bl.gi=
f"); background-repeat: no-repeat;}
..tr_well .tr_b {background-image: url("//ssl.gstatic.com/editor/well_bottom=
..gif"); background-repeat: repeat-x;}
..tr_well .tr_br {background-image: url("//ssl.gstatic.com/editor/well_br.gi=
f"); background-repeat: no-repeat;}
..tr_toolbar-styles .tr_well {border: medium none; padding: 0px; font-size: =
83%; text-align: center;}
..tr_toolbar-vertical .tr_toolbar-styles .tr_well .tr_separator {height: 5px=
; display: block;}
..tr_toolbar-styles .tr_well .tr_selected-style {background: rgb(250, 209, 9=
9) none repeat scroll 0% 0%;}
..tr_toolbar-styles .tr_well .tr_unselected-style span {color: rgb(97, 97, 1=
88); text-decoration: underline; font-weight: normal; cursor: pointer;}
..tr_toolbar-styles .tr_well .tr_selected-style span {font-weight: bold; cur=
sor: pointer;}
..tr_toolbar-vertical .tr_toolbar-styles {float: left;}
..tr_toolbar-vertical .tr_toolbar-styles .tr_well {width: 7.8em;}
..goog-tab {position: relative; border: 1px solid rgb(51, 102, 153); padding=
: 4px 8px; color: rgb(51, 51, 51); background: rgb(221, 221, 221) none repe=
at scroll 0% 0%; cursor: default;}
..goog-tab-bar-top .goog-tab {margin: 1px 4px 0px 0px; border-bottom: 0px no=
ne; float: left;}
..goog-tab-bar-bottom .goog-tab {margin: 0px 4px 1px 0px; border-top: 0px no=
ne; float: left;}
..goog-tab-bar-start .goog-tab {margin: 0px 0px 4px 1px; border-right: 0px n=
one;}
..goog-tab-bar-end .goog-tab {margin: 0px 1px 4px 0px; border-left: 0px none=
;}
..goog-tab-hover {background: rgb(238, 238, 238) none repeat scroll 0% 0%;}
..goog-tab-disabled {color: rgb(255, 255, 255); background: rgb(204, 204, 20=
4) none repeat scroll 0% 0%; border-color: rgb(204, 204, 204);}
..goog-tab-selected {background: rgb(255, 255, 255) none repeat scroll 0% 0%=
!important;}
..goog-tab-bar-top .goog-tab-selected {top: 1px; margin-top: 0px; padding-bo=
ttom: 5px;}
..goog-tab-bar-bottom .goog-tab-selected {top: -1px; margin-bottom: 0px; pad=
ding-top: 5px;}
..goog-tab-bar-start .goog-tab-selected {left: 1px; margin-left: 0px; paddin=
g-right: 9px;}
..goog-tab-bar-end .goog-tab-selected {left: -1px; margin-right: 0px; paddin=
g-left: 9px;}
..tr_tabbed-pane-tabs {line-height: 1.3; vertical-align: top; font-size: 10p=
t;}
..tr_tabbed-pane-tabs p {margin-bottom: 0.7ex; font-size: 10pt;}
..tr_tabbed-pane-tabs div {cursor: pointer; width: 148px;}
..tr_tabbed-pane-tabs .tr_tabbed-pane-tab-label {color: blue; text-decoratio=
n: underline;}
..tr_tabbed-pane-tabs td {font-size: 13px;}
..tr_vertical-tab div {padding: 0.5ex 0px 0.5ex 0.7ex;}
..tr_tabbed-pane {padding: 1.3ex 0px; font-size: 10pt;}
..tr_tabbed-pane-tabs .tr_selected-tab-in-tabbed-pane {background: white non=
e repeat scroll 0% 0%;}
..tr_tabbed-pane-tabs .tr_selected-tab-in-tabbed-pane .tr_tabbed-pane-tab-la=
bel {color: black; font-weight: bold; text-decoration: none;}
..tr_tabbed-pane-tab-content {width: 100%; vertical-align: top; padding: 5px=
7px 1px; background: white none repeat scroll 0% 0%; font-size: 10pt;}
..goog-palette {cursor: default; outline: medium none;}
..goog-palette-table {border: 1px solid rgb(102, 102, 102); border-collapse:=
collapse; margin: 5px;}
..goog-palette-cell {border-width: 0px 1px 0px 0px; border-style: none solid=
none none; border-color: currentcolor rgb(102, 102, 102) currentcolor curr=
entcolor; -moz-border-top-colors: none; -moz-border-right-colors: none; -mo=
z-border-bottom-colors: none; -moz-border-left-colors: none; border-image: =
none; cursor: pointer; height: 18px; margin: 0px; text-align: center; verti=
cal-align: middle; width: 18px;}
..goog-palette-cell .goog-palette-colorswatch {border: medium none; font-siz=
e: x-small; height: 18px; position: relative; width: 18px;}
..goog-palette-cell-hover .goog-palette-colorswatch {border: 1px solid rgb(2=
55, 255, 255); height: 16px; width: 16px;}
..goog-palette-cell-selected .goog-palette-colorswatch {background: rgba(0, =
0, 0, 0) url("//ssl.gstatic.com/editor/editortoolbar.png") no-repeat scroll=
-368px 0px; border: 1px solid rgb(51, 51, 51); color: rgb(255, 255, 255); =
font-weight: bold; height: 16px; width: 16px;}
..goog-palette-customcolor {background-color: rgb(250, 250, 250); border: 1p=
x solid rgb(238, 238, 238); color: rgb(102, 102, 102); font-size: x-small; =
height: 15px; position: relative; width: 15px;}
..goog-palette-cell-hover .goog-palette-customcolor {background-color: rgb(2=
55, 238, 238); border: 1px solid rgb(255, 102, 102); color: rgb(255, 102, 1=
02);}
..goog-menu-button {background: rgb(221, 221, 221) url("//ssl.gstatic.com/ed=
itor/button-bg.png") repeat-x scroll left top; border: 0px none; color: rgb=
(0, 0, 0); cursor: pointer; list-style: outside none none; margin: 2px; out=
line: medium none; padding: 0px; text-decoration: none; vertical-align: mid=
dle;}
..goog-menu-button-outer-box ,.goog-menu-button-inner-box {border-style: sol=
id; border-color: rgb(170, 170, 170); vertical-align: top;}
..goog-menu-button-outer-box {margin: 0px; border-width: 1px 0px; padding: 0=
px;}
..goog-menu-button-inner-box {margin: 0px -1px; border-width: 0px 1px; paddi=
ng: 3px 4px;}
* html .goog-menu-button-inner-box ,body .goog-menu-button-inner-box {left:=
-1px;}
* html .goog-menu-button-rtl .goog-menu-button-outer-box ,body .goog-menu-b=
utton-rtl .goog-menu-button-outer-box {left: -1px; right: auto;}
* html .goog-menu-button-rtl .goog-menu-button-inner-box ,body .goog-menu-b=
utton-rtl .goog-menu-button-inner-box {right: auto;}
:first-child + html .goog-menu-button-inner-box {left: -1px;}
:first-child + html .goog-menu-button-rtl .goog-menu-button-inner-box {left=
: 1px; right: auto;}
..goog-menu-button-disabled {background-image: none !important; opacity: 0.3=
;}
..goog-menu-button-disabled .goog-menu-button-outer-box ,.goog-menu-button-d=
isabled .goog-menu-button-inner-box ,.goog-menu-button-disabled .goog-menu-=
button-caption ,.goog-menu-button-disabled .goog-menu-button-dropdown {colo=
r: rgb(51, 51, 51) !important; border-color: rgb(153, 153, 153) !important;=
}
* html .goog-menu-button-disabled ,body .goog-menu-button-disabled {margin:=
2px 1px !important; padding: 0px 1px !important;}
:first-child + html .goog-menu-button-disabled {margin: 2px 1px !important;=
padding: 0px 1px !important;}
..goog-menu-button-hover .goog-menu-button-outer-box ,.goog-menu-button-hove=
r .goog-menu-button-inner-box {border-color: rgb(153, 204, 255) rgb(102, 15=
3, 238) rgb(102, 153, 238) rgb(119, 170, 255) !important;}
..goog-menu-button-active ,.goog-menu-button-open {background-color: rgb(187=
, 187, 187); background-position: left bottom;}
..goog-menu-button-focused .goog-menu-button-outer-box ,.goog-menu-button-fo=
cused .goog-menu-button-inner-box {border-color: orange;}
..goog-menu-button-caption {padding: 0px 4px 0px 0px; vertical-align: top;}
..goog-menu-button-dropdown {height: 15px; width: 7px; background: rgba(0, 0=
, 0, 0) url("//ssl.gstatic.com/editor/editortoolbar.png") no-repeat scroll =
-388px 0px; vertical-align: top;}
..goog-menu-button-collapse-right ,.goog-menu-button-collapse-right .goog-me=
nu-button-outer-box ,.goog-menu-button-collapse-right .goog-menu-button-inn=
er-box {margin-right: 0px;}
..goog-menu-button-collapse-left ,.goog-menu-button-collapse-left .goog-menu=
-button-outer-box ,.goog-menu-button-collapse-left .goog-menu-button-inner-=
box {margin-left: 0px;}
..goog-menu-button-collapse-left .goog-menu-button-inner-box {border-left: 1=
px solid rgb(255, 255, 255);}
..goog-menu-button-collapse-left.goog-menu-button-checked .goog-menu-button-=
inner-box {border-left: 1px solid rgb(221, 221, 221);}
..goog-color-menu-button-indicator {border-bottom: 4px solid rgb(240, 240, 2=
40);}
..goog-color-menu-button .goog-menu-button-inner-box ,.goog-toolbar-color-me=
nu-button .goog-toolbar-menu-button-inner-box {padding-top: 2px !important;=
padding-bottom: 2px !important;}
..goog-custom-button {margin: 2px; border: 0px none; padding: 0px; font-fami=
ly: Arial,sans-serif; color: rgb(0, 0, 0); background: rgb(221, 221, 221) u=
rl("//ssl.gstatic.com/editor/button-bg.png") repeat-x scroll left top; text=
-decoration: none; list-style: outside none none; vertical-align: middle; c=
ursor: default; outline: medium none;}
..goog-custom-button-outer-box ,.goog-custom-button-inner-box {border-style:=
solid; border-color: rgb(170, 170, 170); vertical-align: top;}
..goog-custom-button-outer-box {margin: 0px; border-width: 1px 0px; padding:=
0px;}
..goog-custom-button-inner-box {margin: 0px -1px; border-width: 0px 1px; pad=
ding: 3px 4px; white-space: nowrap;}
* html .goog-custom-button-inner-box ,body .goog-custom-button-inner-box {l=
eft: -1px;}
* html .goog-custom-button-rtl .goog-custom-button-outer-box ,body .goog-cu=
stom-button-rtl .goog-custom-button-outer-box {left: -1px;}
* html .goog-custom-button-rtl .goog-custom-button-inner-box ,body .goog-cu=
stom-button-rtl .goog-custom-button-inner-box {right: auto;}
:first-child + html .goog-custom-button-inner-box {left: -1px;}
:first-child + html .goog-custom-button-rtl .goog-custom-button-inner-box {=
left: 1px;}
..goog-custom-button-disabled {background-image: none !important; opacity: 0=
..3;}
..goog-custom-button-disabled .goog-custom-button-outer-box ,.goog-custom-bu=
tton-disabled .goog-custom-button-inner-box {color: rgb(51, 51, 51) !import=
ant; border-color: rgb(153, 153, 153) !important;}
* html .goog-custom-button-disabled ,body .goog-custom-button-disabled {mar=
gin: 2px 1px !important; padding: 0px 1px !important;}
:first-child + html .goog-custom-button-disabled {margin: 2px 1px !importan=
t; padding: 0px 1px !important;}
..goog-custom-button-hover .goog-custom-button-outer-box ,.goog-custom-butto=
n-hover .goog-custom-button-inner-box {border-color: rgb(153, 204, 255) rgb=
(102, 153, 238) rgb(102, 153, 238) rgb(119, 170, 255) !important;}
..goog-custom-button-active ,.goog-custom-button-checked {background-color: =
rgb(187, 187, 187); background-position: left bottom;}
..goog-custom-button-focused .goog-custom-button-outer-box ,.goog-custom-but=
ton-focused .goog-custom-button-inner-box {border-color: orange;}
..goog-custom-button-collapse-right ,.goog-custom-button-collapse-right .goo=
g-custom-button-outer-box ,.goog-custom-button-collapse-right .goog-custom-=
button-inner-box {margin-right: 0px;}
..goog-custom-button-collapse-left ,.goog-custom-button-collapse-left .goog-=
custom-button-outer-box ,.goog-custom-button-collapse-left .goog-custom-but=
ton-inner-box {margin-left: 0px;}
..goog-custom-button-collapse-left .goog-custom-button-inner-box {border-lef=
t: 1px solid rgb(255, 255, 255);}
..goog-custom-button-collapse-left.goog-custom-button-checked .goog-custom-b=
utton-inner-box {border-left: 1px solid rgb(221, 221, 221);}
* html .goog-custom-button-collapse-left .goog-custom-button-inner-box ,bod=
y .goog-custom-button-collapse-left .goog-custom-button-inner-box {left: 0p=
x;}
:first-child + html .goog-custom-button-collapse-left .goog-custom-button-i=
nner-box {left: 0px;}
..goog-menu {background: rgb(255, 255, 255) none repeat scroll 0% 0%; border=
-color: rgb(204, 204, 204) rgb(102, 102, 102) rgb(102, 102, 102) rgb(204, 2=
04, 204); border-style: solid; border-width: 1px; cursor: default; font: 13=
px Arial,sans-serif; margin: 0px; outline: medium none; padding: 4px 0px; p=
osition: absolute; z-index: 20000;}
..goog-menuitem {color: rgb(0, 0, 0); font: 13px Arial,sans-serif; list-styl=
e: outside none none; margin: 0px; padding: 4px 7em 4px 28px; white-space: =
nowrap;}
..goog-menuitem.goog-menuitem-rtl {padding-left: 7em; padding-right: 28px;}
..goog-menu-nocheckbox .goog-menuitem ,.goog-menu-noicon .goog-menuitem {pad=
ding-left: 12px;}
..goog-menu-noaccel .goog-menuitem {padding-right: 20px;}
..goog-menuitem-content {color: rgb(0, 0, 0); font: 13px Arial,sans-serif;}
..goog-menuitem-disabled .goog-menuitem-accel ,.goog-menuitem-disabled .goog=
-menuitem-content {color: rgb(204, 204, 204) !important;}
..goog-menuitem-disabled .goog-menuitem-icon {opacity: 0.3;}
..goog-menuitem-highlight ,.goog-menuitem-hover {background-color: rgb(214, =
233, 248); border-color: rgb(214, 233, 248); border-style: dotted; border-w=
idth: 1px 0px; padding-bottom: 3px; padding-top: 3px;}
..goog-menuitem-checkbox ,.goog-menuitem-icon {background-repeat: no-repeat;=
height: 16px; left: 6px; position: absolute; right: auto; vertical-align: =
middle; width: 16px;}
..goog-menuitem-rtl .goog-menuitem-checkbox ,.goog-menuitem-rtl .goog-menuit=
em-icon {left: auto; right: 6px;}
..goog-option-selected .goog-menuitem-checkbox ,.goog-option-selected .goog-=
menuitem-icon {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/e=
ditortoolbar.png") no-repeat scroll -512px 0px;}
..goog-menuitem-accel {color: rgb(153, 153, 153); direction: ltr; left: auto=
; padding: 0px 6px; position: absolute; right: 0px; text-align: right;}
..goog-menuitem-rtl .goog-menuitem-accel {left: 0px; right: auto; text-align=
: left;}
..goog-menuitem-mnemonic-hint {text-decoration: underline;}
..goog-menuitem-mnemonic-separator {color: rgb(153, 153, 153); font-size: 12=
px; padding-left: 4px;}
..goog-menuseparator {border-top: 1px solid rgb(204, 204, 204); margin: 4px =
0px; padding: 0px;}
..goog-toolbar {background: rgb(250, 250, 250) url("//ssl.gstatic.com/editor=
/toolbar-bg.png") repeat-x scroll left bottom; border-bottom: 1px solid rgb=
(213, 213, 213); cursor: default; font: 12px Arial,sans-serif; margin: 0px;=
outline: medium none; padding: 2px; position: relative;}
..goog-toolbar-button {margin: 0px 2px; border: 0px none; padding: 0px; font=
-family: Arial,sans-serif; color: rgb(51, 51, 51); text-decoration: none; l=
ist-style: outside none none; vertical-align: middle; cursor: default; outl=
ine: medium none;}
..goog-toolbar-button-outer-box ,.goog-toolbar-button-inner-box {border: 0px=
none; vertical-align: top;}
..goog-toolbar-button-outer-box {margin: 0px; padding: 1px 0px;}
..goog-toolbar-button-inner-box {margin: 0px -1px; padding: 3px 4px;}
* html .goog-toolbar-button-inner-box ,body .goog-toolbar-button-inner-box =
{left: -1px;}
* html .goog-toolbar-button-rtl .goog-toolbar-button-outer-box ,body .goog-=
toolbar-button-rtl .goog-toolbar-button-outer-box {left: -1px;}
* html .goog-toolbar-button-rtl .goog-toolbar-button-inner-box ,body .goog-=
toolbar-button-rtl .goog-toolbar-button-inner-box {right: auto;}
:first-child + html .goog-toolbar-button-inner-box {left: -1px;}
:first-child + html .goog-toolbar-button-rtl .goog-toolbar-button-inner-box=
{left: 1px; right: auto;}
..goog-toolbar-button-disabled {opacity: 0.3;}
..goog-toolbar-button-disabled .goog-toolbar-button-outer-box ,.goog-toolbar=
-button-disabled .goog-toolbar-button-inner-box {color: rgb(51, 51, 51) !im=
portant; border-color: rgb(153, 153, 153) !important;}
* html .goog-toolbar-button-disabled ,body .goog-toolbar-button-disabled {b=
ackground-color: rgb(240, 240, 240); margin: 0px 1px; padding: 0px 1px;}
:first-child + html .goog-toolbar-button-disabled {background-color: rgb(24=
0, 240, 240); margin: 0px 1px; padding: 0px 1px;}
..goog-toolbar-button-hover .goog-toolbar-button-outer-box ,.goog-toolbar-bu=
tton-active .goog-toolbar-button-outer-box ,.goog-toolbar-button-checked .g=
oog-toolbar-button-outer-box ,.goog-toolbar-button-selected .goog-toolbar-b=
utton-outer-box {border-width: 1px 0px; border-style: solid; padding: 0px;}
..goog-toolbar-button-hover .goog-toolbar-button-inner-box ,.goog-toolbar-bu=
tton-active .goog-toolbar-button-inner-box ,.goog-toolbar-button-checked .g=
oog-toolbar-button-inner-box ,.goog-toolbar-button-selected .goog-toolbar-b=
utton-inner-box {border-width: 0px 1px; border-style: solid; padding: 3px;}
..goog-toolbar-button-hover .goog-toolbar-button-outer-box ,.goog-toolbar-bu=
tton-hover .goog-toolbar-button-inner-box {border-color: rgb(161, 186, 223)=
!important;}
..goog-toolbar-button-active ,.goog-toolbar-button-checked ,.goog-toolbar-bu=
tton-selected {background-color: rgb(221, 225, 235) !important;}
..goog-toolbar-button-active .goog-toolbar-button-outer-box ,.goog-toolbar-b=
utton-active .goog-toolbar-button-inner-box ,.goog-toolbar-button-checked .=
goog-toolbar-button-outer-box ,.goog-toolbar-button-checked .goog-toolbar-b=
utton-inner-box ,.goog-toolbar-button-selected .goog-toolbar-button-outer-b=
ox ,.goog-toolbar-button-selected .goog-toolbar-button-inner-box {border-co=
lor: rgb(114, 155, 209);}
..goog-toolbar-button-collapse-right ,.goog-toolbar-button-collapse-right .g=
oog-toolbar-button-outer-box ,.goog-toolbar-button-collapse-right .goog-too=
lbar-button-inner-box {margin-right: 0px;}
..goog-toolbar-button-collapse-left ,.goog-toolbar-button-collapse-left .goo=
g-toolbar-button-outer-box ,.goog-toolbar-button-collapse-left .goog-toolba=
r-button-inner-box {margin-left: 0px;}
* html .goog-toolbar-button-collapse-left .goog-toolbar-button-inner-box ,b=
ody .goog-toolbar-button-collapse-left .goog-toolbar-button-inner-box {left=
: 0px;}
:first-child + html .goog-toolbar-button-collapse-left .goog-toolbar-button=
-inner-box {left: 0px;}
..goog-toolbar-menu-button {margin: 0px 2px; border: 0px none; padding: 0px;=
font-family: Arial,sans-serif; color: rgb(51, 51, 51); text-decoration: no=
ne; list-style: outside none none; vertical-align: middle; cursor: default;=
outline: medium none;}
..goog-toolbar-menu-button-outer-box ,.goog-toolbar-menu-button-inner-box {b=
order: 0px none; vertical-align: top;}
..goog-toolbar-menu-button-outer-box {margin: 0px; padding: 1px 0px;}
..goog-toolbar-menu-button-inner-box {margin: 0px -1px; padding: 3px 4px;}
* html .goog-toolbar-menu-button-inner-box ,body .goog-toolbar-menu-button-=
inner-box {left: -1px;}
* html .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button-outer-box ,b=
ody .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button-outer-box {left=
: -1px;}
* html .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button-inner-box ,b=
ody .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button-inner-box {righ=
t: auto;}
:first-child + html .goog-toolbar-menu-button-inner-box {left: -1px;}
:first-child + html .goog-toolbar-menu-button-rtl .goog-toolbar-menu-button=
-inner-box {left: 1px; right: auto;}
..goog-toolbar-menu-button-disabled {opacity: 0.3;}
..goog-toolbar-menu-button-disabled .goog-toolbar-menu-button-outer-box ,.go=
og-toolbar-menu-button-disabled .goog-toolbar-menu-button-inner-box {color:=
rgb(51, 51, 51) !important; border-color: rgb(153, 153, 153) !important;}
* html .goog-toolbar-menu-button-disabled ,body .goog-toolbar-menu-button-d=
isabled {background-color: rgb(240, 240, 240); margin: 0px 1px; padding: 0p=
x 1px;}
:first-child + html .goog-toolbar-menu-button-disabled {background-color: r=
gb(240, 240, 240); margin: 0px 1px; padding: 0px 1px;}
..goog-toolbar-menu-button-hover .goog-toolbar-menu-button-outer-box ,.goog-=
toolbar-menu-button-active .goog-toolbar-menu-button-outer-box ,.goog-toolb=
ar-menu-button-open .goog-toolbar-menu-button-outer-box {border-width: 1px =
0px; border-style: solid; padding: 0px;}
..goog-toolbar-menu-button-hover .goog-toolbar-menu-button-inner-box ,.goog-=
toolbar-menu-button-active .goog-toolbar-menu-button-inner-box ,.goog-toolb=
ar-menu-button-open .goog-toolbar-menu-button-inner-box {border-width: 0px =
1px; border-style: solid; padding: 3px;}
..goog-toolbar-menu-button-hover .goog-toolbar-menu-button-outer-box ,.goog-=
toolbar-menu-button-hover .goog-toolbar-menu-button-inner-box {border-color=
: rgb(161, 186, 223) !important;}
..goog-toolbar-menu-button-active ,.goog-toolbar-menu-button-open {backgroun=
d-color: rgb(221, 225, 235) !important;}
..goog-toolbar-menu-button-active .goog-toolbar-menu-button-outer-box ,.goog=
-toolbar-menu-button-active .goog-toolbar-menu-button-inner-box ,.goog-tool=
bar-menu-button-open .goog-toolbar-menu-button-outer-box ,.goog-toolbar-men=
u-button-open .goog-toolbar-menu-button-inner-box {border-color: rgb(114, 1=
55, 209);}
..goog-toolbar-menu-button-caption {padding: 0px 4px 0px 0px; vertical-align=
: middle;}
..goog-toolbar-menu-button-dropdown {width: 7px; background: rgba(0, 0, 0, 0=
) url("//ssl.gstatic.com/editor/editortoolbar.png") no-repeat scroll -388px=
0px; vertical-align: middle;}
..goog-toolbar-separator {margin: 0px 2px; border-left: 1px solid rgb(214, 2=
14, 214); border-right: 1px solid rgb(247, 247, 247); padding: 0px; width: =
0px; text-decoration: none; list-style: outside none none; outline: medium =
none; vertical-align: middle; line-height: normal; font-size: 120%; overflo=
w: hidden;}
..goog-toolbar-select .goog-toolbar-menu-button-outer-box {border-width: 1px=
0px; border-style: solid; padding: 0px;}
..goog-toolbar-select .goog-toolbar-menu-button-inner-box {border-width: 0px=
1px; border-style: solid; padding: 3px;}
..goog-toolbar-select .goog-toolbar-menu-button-outer-box ,.goog-toolbar-sel=
ect .goog-toolbar-menu-button-inner-box {border-color: rgb(191, 203, 223);}
..tr-icon {width: 16px; height: 16px; background: rgba(0, 0, 0, 0) url("//ss=
l.gstatic.com/editor/editortoolbar.png") no-repeat scroll 0% 0%; vertical-a=
lign: middle;}
..goog-color-menu-button-indicator .tr-icon {height: 14px;}
..tr-undo ,.goog-toolbar-button-rtl .tr-redo {background-position: 0px cente=
r;}
..tr-redo ,.goog-toolbar-button-rtl .tr-undo {background-position: -16px cen=
ter;}
..tr-fontName .goog-toolbar-menu-button-caption {color: rgb(34, 68, 102); wi=
dth: 16ex; height: 16px; overflow: hidden;}
..tr-fontSize .goog-toolbar-menu-button-caption {color: rgb(34, 68, 102); wi=
dth: 8ex; height: 16px; overflow: hidden;}
..tr-bold {background-position: -32px center;}
..tr-italic {background-position: -48px center;}
..tr-underline {background-position: -64px center;}
..tr-foreColor {height: 14px; background-position: -80px center;}
..tr-backColor {height: 14px; background-position: -96px center;}
..tr-link {font-weight: bold; color: rgb(0, 0, 153); text-decoration: underl=
ine;}
..tr-image {background-position: -112px center;}
..tr-newDrawing {background-position: -592px center;}
..tr-spChar {font-weight: bold; color: rgb(153, 0, 0);}
..tr-indent {background-position: -128px center;}
..tr-rtl-mode .tr-indent {background-position: -400px center;}
..tr-outdent {background-position: -144px center;}
..tr-rtl-mode .tr-outdent {background-position: -416px center;}
..tr-insertUnorderedList {background-position: -160px center;}
..tr-rtl-mode .tr-insertUnorderedList {background-position: -432px center;}
..tr-insertOrderedList {background-position: -176px center;}
..tr-rtl-mode .tr-insertOrderedList {background-position: -448px center;}
..tr-justifyLeft {background-position: -192px center;}
..tr-justifyCenter {background-position: -208px center;}
..tr-justifyRight {background-position: -224px center;}
..tr-justifyFull {background-position: -480px center;}
..tr-BLOCKQUOTE {background-position: -240px center;}
..tr-rtl-mode .tr-BLOCKQUOTE {background-position: -464px center;}
..tr-removeFormat {background-position: -256px center;}
..tr-spell {background-position: -272px center;}
..tr-ltr {background-position: -288px center;}
..tr-rtl {background-position: -304px center;}
..tr-insertModule {background-position: -496px center;}
..tr-strikeThrough {background-position: -544px center;}
..tr-subscript {background-position: -560px center;}
..tr-superscript {background-position: -576px center;}
..tr-equation {background-position: -608px center;}
..tr-editHtml {color: rgb(0, 0, 153);}
..tr-formatBlock .goog-toolbar-menu-button-caption {color: rgb(34, 68, 102);=
width: 12ex; height: 16px; overflow: hidden;}
..goog-menu .goog-palette {outline: medium none; cursor: default;}
..goog-menu .goog-palette-table {margin: 5px; border: 1px solid rgb(102, 102=
, 102); border-collapse: collapse;}
..goog-menu .goog-palette-cell {height: 18px; width: 18px; margin: 0px; bord=
er-width: 0px 1px 0px 0px; border-style: none solid none none; border-color=
: currentcolor rgb(102, 102, 102) currentcolor currentcolor; -moz-border-to=
p-colors: none; -moz-border-right-colors: none; -moz-border-bottom-colors: =
none; -moz-border-left-colors: none; border-image: none; text-align: center=
; vertical-align: middle; cursor: pointer;}
..goog-menu .goog-palette-cell .goog-palette-colorswatch {position: relative=
; height: 18px; width: 18px; border: medium none; font-size: x-small;}
..goog-menu .goog-palette-cell-hover .goog-palette-colorswatch {height: 16px=
; width: 16px; border: 1px solid rgb(255, 255, 255);}
..goog-menu .goog-palette-cell-selected .goog-palette-colorswatch {height: 1=
6px; width: 16px; border: 1px solid rgb(51, 51, 51); color: rgb(255, 255, 2=
55); font-weight: bold; background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/editortoolbar.png") no-repeat scroll -368px center;}
..goog-menu .goog-palette-customcolor {position: relative; height: 15px; wid=
th: 15px; font-size: x-small; background-color: rgb(250, 250, 250); color: =
rgb(102, 102, 102); border: 1px solid rgb(238, 238, 238);}
..goog-menu .goog-palette-cell-hover .goog-palette-customcolor {background-c=
olor: rgb(255, 238, 238); border: 1px solid rgb(255, 102, 102); color: rgb(=
255, 102, 102);}
..tr_toolbar {font-family: arial; font-size: 90%;}
..container ,.containerhover ,.containeron {float: left; margin: 2px 3px 2px=
0px !important; padding: 0px !important; color: rgb(0, 0, 0); cursor: defa=
ult;}
..desc {margin: 0px !important; line-height: 0.2em !important; background: r=
gba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg/cbleft_ltr.gif") no-repeat=
scroll left top;}
..link {margin: 0px !important; padding: 4px 0px 0px 9px !important; backgro=
und: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg/cbleft_ltr.gif") no-=
repeat scroll left bottom;}
..link em {display: block !important; padding: 0px 8px 6px 0px !important; f=
ont-style: normal; line-height: 1em !important; text-decoration: none; text=
-align: center !important; background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/bg/cbright_ltr.gif") no-repeat scroll right bottom;}
div.leftpill ,div.leftpillhover ,div.leftpillon {margin-right: 0px !importa=
nt;}
div.leftpill p em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edit=
or/bg/cbpillbg.gif") no-repeat scroll right bottom;}
div.middlepill ,div.middlepillhover ,div.middlepillon {margin-right: 0px !i=
mportant;}
div.middlepill {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/=
bg/cbpillbg.gif") no-repeat scroll right top;}
div.middlepill p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/=
editor/bg/cbleftpill_ltr.gif") no-repeat scroll left top;}
div.middlepill p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/=
editor/bg/cbleftpill_ltr.gif") no-repeat scroll left bottom;}
div.middlepill p em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbpillbg.gif") no-repeat scroll right bottom;}
div.rightpill p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/e=
ditor/bg/cbleftpill_ltr.gif") no-repeat scroll left top;}
div.rightpill p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/e=
ditor/bg/cbleftpill_ltr.gif") no-repeat scroll left bottom;}
..container {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg/c=
bright_ltr.gif") no-repeat scroll right top;}
..leftpill {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg/cb=
pillbg.gif") no-repeat scroll right top;}
..containerhover {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor=
/bg/cbright_h_ltr.gif") no-repeat scroll right top;}
..containerhover .p1 {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbleft_h_ltr.gif") no-repeat scroll left top;}
..containerhover .p2 {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbleft_h_ltr.gif") no-repeat scroll left bottom;}
..containerhover .p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/bg/cbright_h_ltr.gif") no-repeat scroll right bottom;}
div.middlepillhover {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbpillbg_h.gif") no-repeat scroll right top;}
div.middlepillhover p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/editor/bg/cbleftpill_h_ltr.gif") no-repeat scroll left top;}
div.middlepillhover p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/editor/bg/cbleftpill_h_ltr.gif") no-repeat scroll left bottom;}
div.middlepillhover p.p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstati=
c.com/editor/bg/cbpillbg_h.gif") no-repeat scroll right bottom;}
div.leftpillhover {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edit=
or/bg/cbpillbg_h.gif") no-repeat scroll right top;}
div.leftpillhover p em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/bg/cbpillbg_h.gif") no-repeat scroll right bottom;}
div.leftpillhover .p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.c=
om/editor/bg/cbpillbg_h.gif") no-repeat scroll right bottom;}
div.rightpillhover p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/bg/cbleftpill_h_ltr.gif") no-repeat scroll left top;}
div.rightpillhover p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/bg/cbleftpill_h_ltr.gif") no-repeat scroll left bottom;}
..containeron {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/bg=
/cbright_o_ltr.gif") no-repeat scroll right top;}
..containeron .p1 {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/bg/cbleft_o_ltr.gif") no-repeat scroll left top;}
..containeron .p2 {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/bg/cbleft_o_ltr.gif") no-repeat scroll left bottom;}
..containeron .p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbright_o_ltr.gif") no-repeat scroll right bottom;}
div.middlepillon {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/bg/cbpillbg_o.gif") no-repeat scroll right top;}
div.middlepillon p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/editor/bg/cbleftpill_o_ltr.gif") no-repeat scroll left top;}
div.middlepillon p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.co=
m/editor/bg/cbleftpill_o_ltr.gif") no-repeat scroll left bottom;}
div.middlepillon p.p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.c=
om/editor/bg/cbpillbg_o.gif") no-repeat scroll right bottom;}
div.leftpillon {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/=
bg/cbpillbg_o.gif") no-repeat scroll right top;}
div.leftpillon p em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/ed=
itor/bg/cbpillbg_o.gif") no-repeat scroll right bottom;}
div.leftpillon .p2 em {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/=
editor/bg/cbpillbg_o.gif") no-repeat scroll right bottom;}
div.rightpillon p.desc {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/bg/cbleftpill_o_ltr.gif") no-repeat scroll left top;}
div.rightpillon p.link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com=
/editor/bg/cbleftpill_o_ltr.gif") no-repeat scroll left bottom;}
..container span ,.containerhover span ,.containeron span {background-positi=
on: 0% 50%; padding: 2px 0px 2px 20px !important; margin: -2px 0px !importa=
nt; width: 1px !important; white-space: nowrap !important;}
..container .icon_none ,.containerhover .icon_none ,.containeron .icon_none =
{padding: 2px 0px 2px 2px !important;}
..icon {width: 1.5em !important; font-family: times; line-height: 1.2em !imp=
ortant; font-weight: bold;}
..container .imageOnly ,.containerhover .imageOnly ,.containeron .imageOnly =
{margin-right: -1ex !important; white-space: normal !important; direction: =
ltr;}
..container span.justify ,.containerhover span.justify ,.containeron span.ju=
stify {padding: 0px 0px 0px 12px !important;}
..icon_image {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ico=
ns/icon_image.gif") no-repeat scroll 0% 0%;}
..icon_link {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icon=
s/icon_link.gif") no-repeat scroll 0% 0%;}
..icon_bullet {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_bullet.gif") no-repeat scroll 0% 0%;}
..icon_numbered {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/=
icons/icon_numbered.gif") no-repeat scroll 0% 0%;}
..icon_outdent {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/i=
cons/icon_outdent.gif") no-repeat scroll 0% 0%;}
..icon_indent {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_indent.gif") no-repeat scroll 0% 0%;}
..icon_text {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icon=
s/icon_text.gif") no-repeat scroll 0% 0%;}
..icon_textbg {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_textbg.gif") no-repeat scroll 0% 0%;}
..icon_font {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icon=
s/icon_font.gif") no-repeat scroll 0% 0%;}
..icon_size {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icon=
s/icon_size.gif") no-repeat scroll 0% 0%;}
..icon_justleft {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/=
icons/icon_left.gif") no-repeat scroll 0% 0%;}
..icon_justmiddle {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/icons/icon_middle.gif") no-repeat scroll 0% 0%;}
..icon_justright {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor=
/icons/icon_right.gif") no-repeat scroll 0% 0%;}
..icon_wfield {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_wfield.gif") no-repeat scroll 0% 0%;}
..icon_removeformat {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edi=
tor/icons/icon_removeformatting.gif") no-repeat scroll 0% 0%;}
..icon_blockquote {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/edito=
r/icons/icon_blockquote.gif") no-repeat scroll 0% 0%;}
..icon_gadget {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/ic=
ons/icon_gadget.gif") no-repeat scroll 0% 0%;}
..icon_ltr {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icons=
/icon_ltr_dir.gif") no-repeat scroll 0% 0%;}
..icon_rtl {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.com/editor/icons=
/icon_rtl_dir.gif") no-repeat scroll 0% 0%;}
..toolbar_rtl .icon_bullet {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/icons/icon_bullet_rtl.gif") no-repeat scroll left center;}
..toolbar_rtl .icon_numbered {background: rgba(0, 0, 0, 0) url("//ssl.gstati=
c.com/editor/icons/icon_numbered_rtl.gif") no-repeat scroll left center;}
..toolbar_rtl .icon_outdent {background: rgba(0, 0, 0, 0) url("//ssl.gstatic=
..com/editor/icons/icon_outdent_rtl.gif") no-repeat scroll left center;}
..toolbar_rtl .icon_indent {background: rgba(0, 0, 0, 0) url("//ssl.gstatic.=
com/editor/icons/icon_indent_rtl.gif") no-repeat scroll left center;}
..toolbar_rtl .icon_blockquote {background: rgba(0, 0, 0, 0) url("//ssl.gsta=
tic.com/editor/icons/icon_blockquote_rtl.gif") no-repeat scroll left center=
;}
..link em b {padding-left: 0.2em !important; background: rgba(0, 0, 0, 0) ur=
l("//ssl.gstatic.com/editor/bg/downarrow.gif") no-repeat scroll 80% 50%;}
..disabled {opacity: 0.5; cursor: default;}
#tr_preloadImages {width: 0px; height: 0px; display: inline;}
..cbleft {background-image: url("//ssl.gstatic.com/editor/bg/cbleft_ltr.gif"=
);}
..cbleft_h {background-image: url("//ssl.gstatic.com/editor/bg/cbleft_h_ltr.=
gif");}
..cbleft_o {background-image: url("//ssl.gstatic.com/editor/bg/cbleft_o_ltr.=
gif");}
..cbleftpill {background-image: url("//ssl.gstatic.com/editor/bg/cbleftpill_=
ltr.gif");}
..cbleftpill_h {background-image: url("//ssl.gstatic.com/editor/bg/cbleftpil=
l_h_ltr.gif");}
..cbleftpill_o {background-image: url("//ssl.gstatic.com/editor/bg/cbleftpil=
l_o_ltr.gif");}
..cbpillbggif {background-image: url("//ssl.gstatic.com/editor/bg/cbpillbg.g=
if");}
..cbpillbgpng {background-image: url("//ssl.gstatic.com/editor/bg/cbpillbg.p=
ng");}
..cbpillbg_h {background-image: url("//ssl.gstatic.com/editor/bg/cbpillbg_h.=
gif");}
..cbright {background-image: url("//ssl.gstatic.com/editor/bg/cbright_ltr.gi=
f");}
..cbright_h {background-image: url("//ssl.gstatic.com/editor/bg/cbright_h_lt=
r.gif");}
..cbright_o {background-image: url("//ssl.gstatic.com/editor/bg/cbright_o_lt=
r.gif");}
..downarrow {background-image: url("//ssl.gstatic.com/editor/bg/downarrow.gi=
f");}
..cbpillbg_o {background-image: url("//ssl.gstatic.com/editor/bg/cbpillbg_o.=
gif");}
..tr_popupmenu {position: absolute; z-index: 1000;}
..tr_popupmenu .goog-menu {-moz-user-select: none; background-attachment: sc=
roll; background-color: rgb(195, 217, 255); background-image: none; backgro=
und-repeat: repeat; border-width: 2px; border-style: solid; border-color: r=
gb(232, 241, 255) rgb(157, 174, 205) rgb(157, 174, 205) rgb(232, 241, 255);=
cursor: pointer; padding: 2px;}
..tr_popupmenu .goog-menuitem {background-attachment: scroll; background-col=
or: rgb(195, 217, 255); background-image: none; background-repeat: repeat; =
color: rgb(0, 0, 0);}
..tr_popupmenu .goog-menuitem-highlight {background-color: rgb(85, 112, 204)=
; color: rgb(255, 255, 255);}
..tr_colorpicker {position: absolute; z-index: 1000; background-color: rgb(1=
87, 187, 187);}
..tr_colorpicker .goog-palette {outline: medium none; -moz-user-select: none=
; cursor: default;}
..tr_colorpicker .goog-palette-table {border: 1px solid rgb(102, 102, 102); =
border-collapse: collapse !important; padding: 0px; margin: 0px;}
..tr_colorpicker .goog-palette-cell {height: 13px; width: 15px; margin: 0px;=
border: 0px none; padding: 0px; text-align: center; vertical-align: middle=
;}
..tr_colorpicker .goog-palette-colorswatch {position: relative; height: 13px=
; width: 15px; border: 1px solid rgb(102, 102, 102); font-size: 1px;}
..tr_colorpicker .goog-palette-cell-hover .goog-palette-colorswatch {border:=
1px solid rgb(255, 255, 255);}
..tr_colorpicker .goog-palette-cell-selected .goog-palette-colorswatch {bord=
er: 1px solid rgb(0, 0, 0); color: rgb(255, 255, 255);}
..ac-renderer {border: 1px solid rgb(102, 102, 102); background: rgb(224, 23=
6, 255) none repeat scroll 0% 0%; color: rgb(0, 0, 204); margin: 0px; paddi=
ng: 0px 0px 1px; z-index: 10; position: absolute;}
..ac-renderer div {margin: 2px; cursor: pointer; padding: 0px 10px;}
..ac-renderer div b {color: rgb(0, 0, 255);}
..ac-renderer div.active {background: rgb(195, 217, 255) none repeat scroll =
0% 0%;}
..picker-dialog {background: rgb(255, 255, 255) none repeat scroll 0% 0%; bo=
rder: 1px solid rgb(172, 172, 172); position: absolute; box-shadow: 0px 4px=
16px rgba(0, 0, 0, 0.2); z-index: 1021; outline: medium none; padding: 0px=
;}
..picker.modal-dialog-content {width: 705px; height: 370px; padding: 0px; ma=
rgin: 0px; position: relative; border: 0px none;}
..picker.modal-dialog-bg {background: rgb(255, 255, 255) none repeat scroll =
0% 0%; left: 0px; position: absolute; top: 0px; z-index: 1001;}
..picker.modal-dialog-title ,.picker.modal-dialog-buttons {display: none;}
..picker-frame {width: 100%; height: 100%; border: 0px none; overflow: hidde=
n;}
..goog-toolbar {padding: 6px; border-top: 1px solid rgb(229, 229, 229); bord=
er-bottom: 1px solid rgb(235, 235, 235); background: rgb(245, 245, 245) non=
e repeat scroll 0% 0%;}
..goog-toolbar-button ,.goog-toolbar-menu-button {display: inline-block; tex=
t-align: center; color: rgb(85, 85, 85); font-size: 11px; font-weight: bold=
; height: 27px; padding: 0px 8px; line-height: 27px; transition: all 0.218s=
ease 0s; background-color: rgb(245, 245, 245); background-image: -moz-line=
ar-gradient(center top , rgb(245, 245, 245), rgb(241, 241, 241)); -moz-user=
-select: none; cursor: default; border: 1px solid transparent;}
..goog-toolbar-button-hover ,.goog-toolbar-menu-button-hover {border: 1px so=
lid rgb(198, 198, 198); color: rgb(51, 51, 51); transition: all 0s ease 0s;=
background-color: rgb(248, 248, 248); background-image: -moz-linear-gradie=
nt(center top , rgb(248, 248, 248), rgb(241, 241, 241)); box-shadow: 0px 1p=
x 1px rgba(0, 0, 0, 0.1);}
..goog-toolbar-button-active ,.goog-toolbar-menu-button-active {background-c=
olor: rgb(246, 246, 246); background-image: -moz-linear-gradient(center top=
, rgb(246, 246, 246), rgb(241, 241, 241)); box-shadow: 0px 1px 2px rgba(0,=
0, 0, 0.1) inset;}
..goog-toolbar-button-checked ,.goog-toolbar-menu-button-checked {background=
-color: rgb(238, 238, 238); background-image: -moz-linear-gradient(center t=
op , rgb(238, 238, 238), rgb(224, 224, 224)); box-shadow: 0px 1px 2px rgba(=
0, 0, 0, 0.1) inset; border: 1px solid rgb(204, 204, 204); color: rgb(51, 5=
1, 51);}
..goog-toolbar-button-inner-box ,.goog-toolbar-button-outer-box ,.goog-toolb=
ar-menu-button-inner-box ,.goog-toolbar-menu-button-outer-box {border: medi=
um none !important; padding: 0px !important; margin: 0px !important;}
..goog-toolbar-menu-button-inner-box {padding-top: 1px !important;}
..goog-toolbar-menu-button-caption {padding-bottom: 4px; height: auto !impor=
tant; color: rgb(85, 85, 85) !important;}
..goog-toolbar-menu-button-hover .goog-toolbar-menu-button-caption {color: r=
gb(51, 51, 51) !important;}
..goog-toolbar-menu-button-dropdown {position: relative; top: 3px;}
..goog-color-menu-button-indicator {line-height: 0;}
..tr-icon {display: inline-block;}
..tr-dialog {position: absolute; width: 475px; background: rgb(255, 255, 255=
) none repeat scroll 0% 0%; padding: 38px 42px 30px;}
..tr-dialog button {color: rgb(102, 102, 102); font-size: 11px; font-weight:=
bold; text-align: center; margin-right: 16px; white-space: nowrap; height:=
29px; line-height: 27px; min-width: 74px; outline: 0px none; padding: 0px =
8px; border-radius: 2px; cursor: pointer; transition: all 0.218s ease 0s; d=
isplay: inline-block; border: 1px solid rgba(0, 0, 0, 0.1); background-colo=
r: rgb(245, 245, 245); background-image: -moz-linear-gradient(center top , =
rgb(245, 245, 245), rgb(241, 241, 241));}
..tr-dialog button:hover {transition: all 0.218s ease 0s; box-shadow: 0px 1p=
x 1px rgba(0, 0, 0, 0.1); border: 1px solid rgb(198, 198, 198); color: rgb(=
51, 51, 51); background-color: rgb(248, 248, 248); background-image: -moz-l=
inear-gradient(center top , rgb(248, 248, 248), rgb(241, 241, 241));}
..tr-dialog button.goog-buttonset-default {border: 1px solid rgb(48, 121, 23=
7); color: rgb(255, 255, 255); background-color: rgb(77, 144, 254); backgro=
und-image: -moz-linear-gradient(center top , rgb(77, 144, 254), rgb(71, 135=
, 237));}
..tr-dialog button.goog-buttonset-default:hover {color: rgb(255, 255, 255); =
border: 1px solid rgb(47, 91, 183); background-color: rgb(53, 122, 232); ba=
ckground-image: -moz-linear-gradient(center top , rgb(77, 144, 254), rgb(53=
, 122, 232));}
..tr-link-dialog-target-input ,#linkdialog-text {border-width: 1px; border-s=
tyle: solid; border-color: rgb(192, 192, 192) rgb(217, 217, 217) rgb(217, 2=
17, 217); -moz-border-top-colors: none; -moz-border-right-colors: none; -mo=
z-border-bottom-colors: none; -moz-border-left-colors: none; border-image: =
none; vertical-align: top; box-sizing: border-box; border-radius: 1px; disp=
lay: inline-block; background-color: rgb(255, 255, 255); line-height: 27px;=
padding-left: 8px; color: rgb(51, 51, 51); height: 29px;}
..tr-link-dialog-target-input:hover ,#linkdialog-text:hover {border-width: 1=
px; border-style: solid; border-color: rgb(160, 160, 160) rgb(185, 185, 185=
) rgb(185, 185, 185); -moz-border-top-colors: none; -moz-border-right-color=
s: none; -moz-border-bottom-colors: none; -moz-border-left-colors: none; bo=
rder-image: none; box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset;}
..tr-link-dialog-target-input:focus ,#linkdialog-text:focus {box-shadow: 0px=
1px 2px rgba(0, 0, 0, 0.3) inset; outline: medium none; border: 1px solid =
rgb(77, 144, 254);}
..tr-dialog .modal-dialog-title {display: none;}
#linkdialog-text {position: relative; top: -7px; margin-bottom: 12px;}
..tr-tabpane-caption {margin-bottom: 4px;}
..tr-tabpane .goog-tab-bar {background: rgba(0, 0, 0, 0) none repeat scroll =
0% 0%; margin-right: 12px; height: 160px;}
..tr-tabpane .goog-tab {border: medium none; background: rgb(255, 255, 255) =
none repeat scroll 0% 0%; padding: 8px; left: 0px; margin-left: 0px;}
..tr-tabpane .goog-tab-selected {border: medium none; background: rgb(255, 2=
55, 255) none repeat scroll 0% 0%; padding: 8px; left: 0px;}
..tr-tabpane .goog-tab-hover {background: rgb(238, 238, 238) none repeat scr=
oll 0% 0%;}
..tr-tabpane .goog-tab input {margin-left: 0px;}
..tr-dialog .modal-dialog-buttons {margin-top: 24px;}
..tr-dialog .goog-link-button {text-decoration: none; color: rgb(17, 85, 204=
); cursor: pointer; margin-top: 0px !important; margin-bottom: 8px;}
..tr-link-dialog-target-input {display: block; margin: 8px 0px; width: 280px=
!important;}
..tr-link-dialog-explanation-text {line-height: 17px;}
..tr-fontSize .goog-toolbar-menu-button-caption {min-width: 8ex; width: auto=
; overflow: auto; white-space: nowrap;}
plaintext {display: none;}
html {color:rgb(34, 34, 34);visibility:visible;quotes:"=E2=80=9C" "=E2=80=
=9D" "=E2=80=98" "=E2=80=99";list-style-type:disc;list-style-image:none;lis=
t-style-position:outside;page-break-inside:auto;font-family:"Arial","Helvet=
ica",sans-serif;font-style:normal;font-variant:normal;font-weight:400;text-=
indent:0px;text-align:start;text-transform:none;white-space:normal;caption-=
side:top;border-collapse:separate;border-spacing:0px 0px;empty-cells:show;c=
ursor:auto;}
body {position:relative !important;top:0 !important;left:0 !important;right=
:auto !important;display:block !important;visibility:visible !important;fon=
t-family:"Arial","Helvetica",sans-serif !important;font-size:13px !importan=
t;font-weight:400 !important;font-variant:normal !important;font-style:norm=
al !important;color:rgb(34, 34, 34) !important;text-align:start !important;=
text-decoration:none !important;text-indent:0px !important;text-transform:n=
one !important;letter-spacing:normal !important;white-space:normal !importa=
nt;word-spacing:0px !important;}
img {-moz-force-broken-image-icon: 1;}</style><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/be270d3b-d86d-4e6d-9e9c-483a9ea7eb98%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/be270d3b-d86d-4e6d-9e9c-483a9ea7eb98=
%40isocpp.org</a>.<br />
------=_Part_15953_850576071.1513178762459--
------=_Part_15952_43189376.1513178762420--
.
Author: Richard Hodges <hodges.r@gmail.com>
Date: Wed, 13 Dec 2017 16:58:07 +0100
Raw View
--94eb2c05b4ba6a0ada05603ad50b
Content-Type: text/plain; charset="UTF-8"
answer inline
On 13 December 2017 at 16:26, Nicol Bolas <jmckesson@gmail.com> wrote:
> On Wednesday, December 13, 2017 at 5:15:56 AM UTC-5, Richard Hodges wrote:
>>
>> A simple example:
>>
>> Here's a fairly common idiom, expressed in terms of a structured binding:
>>
>
> I'm sure some people do this, but an indexed range view would handle this
> much more easily and compactly:
>
I had anticipated answers like this. Of course, there are other ways to
implement this specific idiom. I have used it as a simple example of
multiple initialisations of disparate types firmly within the scope of a
for-loop
>
> for(auto &[i, val] : std::counted_view(rng))
> {...}
>
> #include <iostream>
>> #include <vector>
>> #include <tuple>
>>
>> int main()
>> {
>> std::vector<int> v = { 6,5,4,3,2,1 };
>>
>> for( auto [i, first, last] = std::make_tuple(std::size_t(0),
>> begin(v), end(v))
>> ; first != last
>> ; ++i, ++first)
>> {
>> std::cout << "index: " << i << "\t" << *first << "\n";
>> }
>> }
>>
>> It seems sensible to me to group the loop's variables in a structured
>> binding since
>>
>>
>> - it's succinct and,
>> - they remain firmly local to the loop's scope
>> - It's the only way to declare multiple dissimilar variables within
>> the for statement.
>>
>>
>> However, this code is not DRY - the naming of the bound variables must
>> correspond to the creation of the tuple. Maintenance confusion awaits.
>>
>
> Perhaps you're mistaking DRY for some other principle. DRY is Don't Repeat
> Yourself. This code involves no repetition of typenames, variable names,
> objects, literals, or anything else. Nothing is being repeated; there is
> simply distance between the "variable" and its initializer.
>
> That has nothing to do with repetition.
>
Fair enough, we'll settle on "distance". I think you'd agree that we'd
prefer not to have this distance.
>
> It seems to me that a small, non-breaking syntax change could allow this:
>>
>
> Structured binding should not be used as a quick-and-dirty way to create
> multiple variables of different types in a place where that wasn't possible
> previously. And we *certainly* should not add syntax to encourage this.
>
This is sounding like unsubstansiated opinion. And I respectfully disagree
- it seems useful to me to be able to create a tuple with named arguments
in a local slope on the fly.
>
> Remember: they could have made `auto` do this exact thing when we
> standardized it in 2011. But the committee expressly decided against it.
> All of the reasons for not allowing it then are still just as valid now.
>
I am not privy to the reasons. Are you able to elaborate please? I don't
think structured bindings were on the table back in 2011.
>
>
>> for( auto [i = size_t(0), first = begin(v), last = end(v)]
>> ; first != last
>> ; ++i, ++first)
>> {
>> // ...
>> }
>>
>> which would:
>>
>> a) *be 100% DRY*,
>> b) involve less typing
>>
>
> 59 characters vs. 79. That's not "much less", especially compared to the
> 45 characters in the range-based version.
>
No, it's not "much less". It's "less", as I originally wrote. However,
perhaps we digress. The primary benefit (marked "a" and formatted in bold)
is that it is DRY. Which I think we would all agree is a good thing (even
if we disagree on the method to achieve it).
>
>
>> c) match the syntax for lambda capture (I could expand further on my
>> thoughts on that, but perhaps another day)
>> d) IMHO be easier to teach
>>
>
> This isn't something people should be doing anyway. So why would we want
> it to be easy to teach?
>
Please kindly provide me with the reasoning behind this (very strong)
assertion.
>
>
> --
> 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/be270d3b-d86d-4e6d-
> 9e9c-483a9ea7eb98%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/be270d3b-d86d-4e6d-9e9c-483a9ea7eb98%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CALvx3hb6wYU1mMauvz9egc2UNDwu1_9dWAydDsMEuQN%3DA%2B5FFg%40mail.gmail.com.
--94eb2c05b4ba6a0ada05603ad50b
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">answer inline<br><div class=3D"gmail_extra"><br><div class=
=3D"gmail_quote">On 13 December 2017 at 16:26, Nicol Bolas <span dir=3D"ltr=
"><<a href=3D"mailto:jmckesson@gmail.com" target=3D"_blank">jmckesson@gm=
ail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=3D=
"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D=
"ltr">On Wednesday, December 13, 2017 at 5:15:56 AM UTC-5, Richard Hodges w=
rote:<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">A simple exam=
ple:<br><br>Here's a fairly common idiom, expressed in terms of a struc=
tured binding:</div></blockquote><div><br></div><div>I'm sure some peop=
le do this, but an indexed range view would handle this much more easily an=
d compactly:</div></div></blockquote><div><br></div><div>I had anticipated =
answers like this. Of course, there are other ways to implement this specif=
ic idiom. I have used it as a simple example of multiple initialisations of=
disparate types firmly within the scope of a for-loop<br></div><div>=C2=A0=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-l=
eft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div s=
tyle=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);bor=
der-style:solid;border-width:1px" class=3D"m_-7224755819279555094prettyprin=
t"><code class=3D"m_-7224755819279555094prettyprint"><div class=3D"m_-72247=
55819279555094subprettyprint"><span style=3D"color:#008" class=3D"m_-722475=
5819279555094styled-by-prettify">for</span><span style=3D"color:#660" class=
=3D"m_-7224755819279555094styled-by-prettify">(</span><span style=3D"color:=
#008" class=3D"m_-7224755819279555094styled-by-prettify">auto</span><span s=
tyle=3D"color:#000" class=3D"m_-7224755819279555094styled-by-prettify"> </s=
pan><span style=3D"color:#660" class=3D"m_-7224755819279555094styled-by-pre=
ttify">&[</span><span style=3D"color:#000" class=3D"m_-7224755819279555=
094styled-by-prettify">i</span><span style=3D"color:#660" class=3D"m_-72247=
55819279555094styled-by-prettify">,</span><span style=3D"color:#000" class=
=3D"m_-7224755819279555094styled-by-prettify"> val</span><span style=3D"col=
or:#660" class=3D"m_-7224755819279555094styled-by-prettify">]</span><span s=
tyle=3D"color:#000" class=3D"m_-7224755819279555094styled-by-prettify"> </s=
pan><span style=3D"color:#660" class=3D"m_-7224755819279555094styled-by-pre=
ttify">:</span><span style=3D"color:#000" class=3D"m_-7224755819279555094st=
yled-by-prettify"> std</span><span style=3D"color:#660" class=3D"m_-7224755=
819279555094styled-by-prettify">::</span><span style=3D"color:#000" class=
=3D"m_-7224755819279555094styled-by-prettify">counted_view</span><span styl=
e=3D"color:#660" class=3D"m_-7224755819279555094styled-by-prettify">(</span=
><span style=3D"color:#000" class=3D"m_-7224755819279555094styled-by-pretti=
fy">rng</span><span style=3D"color:#660" class=3D"m_-7224755819279555094sty=
led-by-prettify">))</span><span style=3D"color:#000" class=3D"m_-7224755819=
279555094styled-by-prettify"><br></span><span style=3D"color:#660" class=3D=
"m_-7224755819279555094styled-by-prettify">{...}</span><span style=3D"color=
:#000" class=3D"m_-7224755819279555094styled-by-prettify"><br></span></div>=
</code></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"marg=
in:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div di=
r=3D"ltr"><div></div><div><div><font face=3D"monospace, monospace">#include=
<iostream></font></div><div><font face=3D"monospace, monospace">#inc=
lude <vector></font></div><div><font face=3D"monospace, monospace">#i=
nclude <tuple></font></div><div><font face=3D"monospace, monospace"><=
br></font></div><div><font face=3D"monospace, monospace">int main()</font><=
/div><div><font face=3D"monospace, monospace">{</font></div><div><font face=
=3D"monospace, monospace">=C2=A0 =C2=A0 std::vector<int> v =3D { 6,5,=
4,3,2,1 };</font></div><div><font face=3D"monospace, monospace"><br></font>=
</div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 for( auto [i, =
first, last] =3D std::make_tuple(std::size_t(0)<wbr>, begin(v), end(v))</fo=
nt></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=
=A0; first !=3D last</font></div><div><font face=3D"monospace, monospace">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></div><div><font face=3D"m=
onospace, monospace">=C2=A0 =C2=A0 {</font></div><div><font face=3D"monospa=
ce, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 std::cout << "index: =
" << i << "\t" << *first << "\n=
";</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =
}</font></div><div><font face=3D"monospace, monospace">}</font></div></div>=
<div><br></div><div>It seems sensible to me to group the loop's variabl=
es in a structured binding since=C2=A0</div><div><br></div><ul><li>it's=
succinct and,</li><li>they remain firmly local to the loop's scope</li=
><li>It's the only way to declare multiple dissimilar variables within =
the for statement.<br></li></ul><div><br></div><div>However, this code is n=
ot DRY - the naming of the bound variables must correspond to the creation =
of the tuple. Maintenance confusion awaits.<br></div></div></blockquote><di=
v><br></div><div>Perhaps you're mistaking DRY for some other principle.=
DRY is Don't Repeat Yourself. This code involves no repetition of type=
names, variable names, objects, literals, or anything else. Nothing is bein=
g repeated; there is simply distance between the "variable" and i=
ts initializer.</div><div><br></div><div>That has nothing to do with repeti=
tion.<br></div></div></blockquote><div><br></div><div>Fair enough, we'l=
l settle on "distance". I think you'd agree that we'd pre=
fer not to have this distance.<br></div><div>=C2=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex"><div dir=3D"ltr"><div></div><div><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc s=
olid;padding-left:1ex"><div dir=3D"ltr"><div></div><div></div><div>It seems=
to me that a small, non-breaking syntax change could allow this:</div></di=
v></blockquote><div><br></div><div>Structured binding should not be used as=
a quick-and-dirty way to create multiple variables of different types in a=
place where that wasn't possible previously. And we <i>certainly</i> s=
hould not add syntax to encourage this.</div></div></blockquote><div><br></=
div><div>This is sounding like unsubstansiated opinion. And I respectfully =
disagree - it seems useful to me to be able to create a tuple with named ar=
guments in a local slope on the fly.<br></div><div>=C2=A0</div><blockquote =
class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid=
;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Remember: they coul=
d have made `auto` do this exact thing when we standardized it in 2011. But=
the committee expressly decided against it. All of the reasons for not all=
owing it then are still just as valid now.<br></div></div></blockquote><div=
><br></div><div>I am not privy to the reasons. Are you able to elaborate pl=
ease? I don't think structured bindings were on the table back in 2011.=
<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margi=
n:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">=
<div></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin=
:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div><div><font face=3D"monospace, monospace">=C2=
=A0 =C2=A0 for( auto [i =3D size_t(0), first =3D begin(v), last =3D end(v)]=
</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0; first !=3D last</font></div><div><font face=3D"monospace, monospace=
">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></div><div><font face=3D=
"monospace, monospace">=C2=A0 =C2=A0 {</font></div><div><font face=3D"monos=
pace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 // ...</font></div><div><font =
face=3D"monospace, monospace">=C2=A0 =C2=A0 }</font></div></div><div><font =
face=3D"monospace, monospace"><br></font></div><div>which would:</div><div>=
<br></div><div>a) <b>be 100% DRY</b>,</div><div>b) involve less typing</div=
></div></blockquote><div><br></div><div>59 characters vs. 79. That's no=
t "much less", especially compared to the 45 characters in the ra=
nge-based version.<br></div></div></blockquote><div><br></div><div>No, it&#=
39;s not "much less". It's "less", as I originally =
wrote. However, perhaps we digress. The primary benefit (marked "a&quo=
t; and formatted in bold) is that it is DRY. Which I think we would all agr=
ee is a good thing (even if we disagree on the method to achieve it).<br></=
div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-lef=
t:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>=C2=A0<=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;=
border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>c) match=
the syntax for lambda capture (I could expand further on my thoughts on th=
at, but perhaps another day)<br></div><div>d) IMHO be easier to teach</div>=
</div></blockquote><div><br></div><div>This isn't something people shou=
ld be doing anyway. So why would we want it to be easy to teach?</div></div=
></blockquote><div><br></div><div>Please kindly provide me with the reasoni=
ng behind this (very strong) assertion.=C2=A0 <br></div><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex"><div dir=3D"ltr"><div><span class=3D"HOEnZb"><font color=3D"#=
888888"><br></font></span></div><span class=3D"HOEnZb"><font color=3D"#8888=
88"><br></font></span></div><span class=3D"HOEnZb"><font color=3D"#888888">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/be270d3b-d86d-4e6d-9e9c-483a9ea7eb98%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/be27=
0d3b-d86d-4e6d-<wbr>9e9c-483a9ea7eb98%40isocpp.org</a><wbr>.<br>
</font></span></blockquote></div><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CALvx3hb6wYU1mMauvz9egc2UNDwu1_9dWAyd=
DsMEuQN%3DA%2B5FFg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hb6wYU1=
mMauvz9egc2UNDwu1_9dWAydDsMEuQN%3DA%2B5FFg%40mail.gmail.com</a>.<br />
--94eb2c05b4ba6a0ada05603ad50b--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Wed, 13 Dec 2017 15:58:25 +0000
Raw View
--001a1137b9107c1b2505603ad625
Content-Type: text/plain; charset="UTF-8"
On 13 Dec 2017 15:26, "Nicol Bolas" <jmckesson@gmail.com> wrote:
Perhaps you're mistaking DRY for some other principle. DRY is Don't Repeat
Yourself. This code involves no repetition of typenames, variable names,
objects, literals, or anything else. Nothing is being repeated; there is
simply distance between the "variable" and its initializer.
That has nothing to do with repetition.
....
59 characters vs. 79. That's not "much less"
Your comments here sound like you are only considering the case of this
occurring only once. It seems to me that the snippet provided is an example
of something one may do multiple times in a program, and with the approach
in the snippet it would violate DRY. Your provided approach is certainly
nice, but limited to one use case.
I would like auto to allow multiple types for a different use case -
iterating through N vectors whose elements are related by a common index
when it isn't feasible to store them in as pairs in the same vector (e.g. a
set of core data and some set of customisable metrics on that data that are
only used in one part of the program). Sure, there may be some lovely
templated ways around this (in my case I just take the iterator definitions
outside the loop and make it a while. Ugly but functional. If there is some
nice multi-iterator functionality in the STL, I sure as hell couldn't find
it), but one nice way would be to allow their definitions be placed in the
first for statement even though their types are different.
This seems like a very attractive extension of current auto functionality.
We can even rename it to "multi_auto" or something if it clashes with some
obscure implicit casts (I'm not actually sure if that's a thing though).
From my point of view, forcing types to be identical in the first statement
of a for loop is a side-effect of the nature of single statements, not some
useful piece of functionality that does us any favours.
--
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/CAC%2B0CCOi9nDHHP-yn%3D5%2BJd0_aGTtALJ8Bpe-4Xcq4CTyryzQ%2BQ%40mail.gmail.com.
--001a1137b9107c1b2505603ad625
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto"><div><br><div class=3D"gmail_extra"><br><div class=3D"gma=
il_quote">On 13 Dec 2017 15:26, "Nicol Bolas" <<a href=3D"mail=
to:jmckesson@gmail.com">jmckesson@gmail.com</a>> wrote:<blockquote class=
=3D"quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-le=
ft:1ex"><div dir=3D"ltr"><div>Perhaps you're mistaking DRY for some oth=
er principle. DRY is Don't Repeat Yourself. This code involves no repet=
ition of typenames, variable names, objects, literals, or anything else. No=
thing is being repeated; there is simply distance between the "variabl=
e" and its initializer.</div><div><br></div><div>That has nothing to d=
o with repetition.</div></div></blockquote></div></div></div><div dir=3D"au=
to"><div class=3D"gmail_extra"><div class=3D"gmail_quote"><blockquote class=
=3D"quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-le=
ft:1ex"><div dir=3D"ltr"><div class=3D"quoted-text"><div><br></div></div><d=
iv>...</div></div></blockquote></div></div></div><div dir=3D"auto"><div cla=
ss=3D"gmail_extra"><div class=3D"gmail_quote"><blockquote class=3D"quote" s=
tyle=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div=
dir=3D"ltr"><div>59 characters vs. 79. That's not "much less"=
;</div></div></blockquote></div></div></div><div dir=3D"auto"><br></div><di=
v dir=3D"auto">Your comments here sound like you are only considering the c=
ase of this occurring only once. It seems to me that the snippet provided i=
s an example of something one may do multiple times in a program, and with =
the approach in the snippet it would violate DRY. Your provided approach is=
certainly nice, but limited to one use case.</div><div dir=3D"auto"><br></=
div><div dir=3D"auto">I would like auto to allow multiple types for a diffe=
rent use case - iterating through N vectors whose elements are related by a=
common index when it isn't feasible to store them in as pairs in the s=
ame vector (e.g. a set of core data and some set of customisable metrics on=
that data that are only used in one part of the program). Sure, there may =
be some lovely templated ways around this (in my case I just take the itera=
tor definitions outside the loop and make it a while. Ugly but functional. =
If there is some nice multi-iterator functionality in the STL, I sure as he=
ll couldn't find it), but one nice way would be to allow their definiti=
ons be placed in the first for statement even though their types are differ=
ent.=C2=A0</div><div dir=3D"auto"><br></div><div dir=3D"auto">This seems li=
ke a very attractive extension of current auto functionality. We can even r=
ename it to "multi_auto" or something if it clashes with some obs=
cure implicit casts (I'm not actually sure if that's a thing though=
). From my point of view, forcing types to be identical in the first statem=
ent of a for loop is a side-effect of the nature of single statements, not =
some useful piece of functionality that does us any favours.</div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCOi9nDHHP-yn%3D5%2BJd0_aGTtAL=
J8Bpe-4Xcq4CTyryzQ%2BQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoo=
ter">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CC=
Oi9nDHHP-yn%3D5%2BJd0_aGTtALJ8Bpe-4Xcq4CTyryzQ%2BQ%40mail.gmail.com</a>.<br=
/>
--001a1137b9107c1b2505603ad625--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Wed, 13 Dec 2017 09:05:58 -0800 (PST)
Raw View
------=_Part_394_1861205341.1513184758273
Content-Type: multipart/alternative;
boundary="----=_Part_395_357610886.1513184758274"
------=_Part_395_357610886.1513184758274
Content-Type: text/plain; charset="UTF-8"
On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges wrote:
>
> answer inline
>
> On 13 December 2017 at 16:26, Nicol Bolas <jmck...@gmail.com <javascript:>
> > wrote:
>
>> On Wednesday, December 13, 2017 at 5:15:56 AM UTC-5, Richard Hodges wrote:
>>>
>>> A simple example:
>>>
>>> Here's a fairly common idiom, expressed in terms of a structured binding:
>>>
>>
>> I'm sure some people do this, but an indexed range view would handle this
>> much more easily and compactly:
>>
>
> I had anticipated answers like this. Of course, there are other ways to
> implement this specific idiom. I have used it as a simple example of
> multiple initialisations of disparate types firmly within the scope of a
> for-loop
>
>
>>
>> for(auto &[i, val] : std::counted_view(rng))
>> {...}
>>
>> #include <iostream>
>>> #include <vector>
>>> #include <tuple>
>>>
>>> int main()
>>> {
>>> std::vector<int> v = { 6,5,4,3,2,1 };
>>>
>>> for( auto [i, first, last] = std::make_tuple(std::size_t(0),
>>> begin(v), end(v))
>>> ; first != last
>>> ; ++i, ++first)
>>> {
>>> std::cout << "index: " << i << "\t" << *first << "\n";
>>> }
>>> }
>>>
>>> It seems sensible to me to group the loop's variables in a structured
>>> binding since
>>>
>>>
>>> - it's succinct and,
>>> - they remain firmly local to the loop's scope
>>> - It's the only way to declare multiple dissimilar variables within
>>> the for statement.
>>>
>>>
>>> However, this code is not DRY - the naming of the bound variables must
>>> correspond to the creation of the tuple. Maintenance confusion awaits.
>>>
>>
>> Perhaps you're mistaking DRY for some other principle. DRY is Don't
>> Repeat Yourself. This code involves no repetition of typenames, variable
>> names, objects, literals, or anything else. Nothing is being repeated;
>> there is simply distance between the "variable" and its initializer.
>>
>> That has nothing to do with repetition.
>>
>
> Fair enough, we'll settle on "distance". I think you'd agree that we'd
> prefer not to have this distance.
>
>
>>
>> It seems to me that a small, non-breaking syntax change could allow this:
>>>
>>
>> Structured binding should not be used as a quick-and-dirty way to create
>> multiple variables of different types in a place where that wasn't possible
>> previously. And we *certainly* should not add syntax to encourage this.
>>
>
> This is sounding like unsubstansiated opinion. And I respectfully disagree
> - it seems useful to me to be able to create a tuple with named arguments
> in a local slope on the fly.
>
And you can do that already. What we shouldn't do is* encourage* it or hide
the fact that this is what you're doing.
Here's the thing. The only time you absolutely* need* this feature is when
you're declaring variables in a place where you only get one declaration.
Because if you can make multiple declarations, there's nothing stopping you
from doing:
auto i = size_t(0);
auto first = begin(v);
auto last = end(v);
I find these lines to be far more readable than the structured binding
version or your alternative structured binding syntax. So the only time
people should use your alternate syntax is when they're only allowed a
single declaration. And that means in the initializer section of some
statement.
Do we really need to add special syntax for something that only gets used
in such limited scenarios? Even worse, if we add such syntax, aren't we
encouraging people to declare a bunch of variables in one line, which is
generally considered bad form?
No, it's best to just leave things as they are. In those circumstances
where it is necessary to achieve what you want, you can still do it. But
the poor syntax and copying behavior will encourage you to avoid it
whenever possible.
Remember: they could have made `auto` do this exact thing when we
>> standardized it in 2011. But the committee expressly decided against it.
>> All of the reasons for not allowing it then are still just as valid now.
>>
>
> I am not privy to the reasons. Are you able to elaborate please? I don't
> think structured bindings were on the table back in 2011.
>
I didn't say structured bindings. I said `auto`.
Remember: what you want* is not structured bindings*. Structured binding is
about unpacking objects that store data into multiple variable-like
constructs. You don't have such a object, and you don't really want one.
The only reason you created a tuple of values was because structured
binding *requires* it.
What you really want is the ability to declare multiple variables of
different types in a single declaration statement. When `auto` was being
standardized, there was discussion about allowing precisely that:
auto x = 5.0f, y = 10, z = std::string("foo");
These would deduce 3 different types for the 3 variables. The committee
specifically decided* against* doing this.
Through structured bindings, you can achieve a similar effect as that. But
if we wanted that effect, we'd have allowed it to begin with.
> for( auto [i = size_t(0), first = begin(v), last = end(v)]
>>> ; first != last
>>> ; ++i, ++first)
>>> {
>>> // ...
>>> }
>>>
>>> which would:
>>>
>>> a) *be 100% DRY*,
>>> b) involve less typing
>>>
>>
>> 59 characters vs. 79. That's not "much less", especially compared to the
>> 45 characters in the range-based version.
>>
>
> No, it's not "much less". It's "less", as I originally wrote. However,
> perhaps we digress. The primary benefit (marked "a" and formatted in bold)
> is that it is DRY.
>
But it isn't DRY; as we previously agreed, there's no repetition being
eliminated. There is only distance.
> Which I think we would all agree is a good thing (even if we disagree on
> the method to achieve it).
>
No, not really. I don't want to see code like that, and I don't want to
encourage people to have such long variable declaration sequences all in
one statement like that.
If you're having to break a `for` loop or `if` statement or whatever into
multiple lines just to make them legible, it suggests that there's a
problem in your code. The longer such statements get, the harder it is to
follow what's going on.
Indeed, reducing such verbosity is partially why we created range-based
`for` in the first place. The idiom you're talking about is not an
anti-pattern per-se, but it ought to be considered a code smell. When you
use it, it should be because there is no better way to do what you're doing.
--
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/0dbd4344-23a7-4578-ad5c-e7727dfecf27%40isocpp.org.
------=_Part_395_357610886.1513184758274
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Rich=
ard Hodges wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr">answer inline<br><div><br><div class=3D"gmail_quote">On 13 December 201=
7 at 16:26, Nicol Bolas <span dir=3D"ltr"><<a onmousedown=3D"this.href=
=3D'javascript:';return true;" onclick=3D"this.href=3D'javascri=
pt:';return true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofoll=
ow" gdf-obfuscated-mailto=3D"meqBgWyPAAAJ">jmck...@gmail.com</a>></span>=
wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bor=
der-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Wednesday, De=
cember 13, 2017 at 5:15:56 AM UTC-5, Richard Hodges wrote:<blockquote class=
=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc s=
olid;padding-left:1ex"><div dir=3D"ltr">A simple example:<br><br>Here's=
a fairly common idiom, expressed in terms of a structured binding:</div></=
blockquote><div><br></div><div>I'm sure some people do this, but an ind=
exed range view would handle this much more easily and compactly:</div></di=
v></blockquote><div><br></div><div>I had anticipated answers like this. Of =
course, there are other ways to implement this specific idiom. I have used =
it as a simple example of multiple initialisations of disparate types firml=
y within the scope of a for-loop<br></div><div>=C2=A0</div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;pad=
ding-left:1ex"><div dir=3D"ltr"><div><br></div><div style=3D"background-col=
or:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border=
-width:1px"><code><div><span style=3D"color:#008">for</span><span style=3D"=
color:#660">(</span><span style=3D"color:#008">auto</span><span style=3D"co=
lor:#000"> </span><span style=3D"color:#660">&[</span><span style=3D"co=
lor:#000">i</span><span style=3D"color:#660">,</span><span style=3D"color:#=
000"> val</span><span style=3D"color:#660">]</span><span style=3D"color:#00=
0"> </span><span style=3D"color:#660">:</span><span style=3D"color:#000"> s=
td</span><span style=3D"color:#660">::</span><span style=3D"color:#000">cou=
nted_view</span><span style=3D"color:#660">(</span><span style=3D"color:#00=
0">rng</span><span style=3D"color:#660">))</span><span style=3D"color:#000"=
><br></span><span style=3D"color:#660">{...}</span><span style=3D"color:#00=
0"><br></span></div></code></div><div><br></div><blockquote class=3D"gmail_=
quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;paddi=
ng-left:1ex"><div dir=3D"ltr"><div></div><div><div><font face=3D"monospace,=
monospace">#include <iostream></font></div><div><font face=3D"monosp=
ace, monospace">#include <vector></font></div><div><font face=3D"mono=
space, monospace">#include <tuple></font></div><div><font face=3D"mon=
ospace, monospace"><br></font></div><div><font face=3D"monospace, monospace=
">int main()</font></div><div><font face=3D"monospace, monospace">{</font><=
/div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 std::vector<=
int> v =3D { 6,5,4,3,2,1 };</font></div><div><font face=3D"monospace, mo=
nospace"><br></font></div><div><font face=3D"monospace, monospace">=C2=A0 =
=C2=A0 for( auto [i, first, last] =3D std::make_tuple(std::size_t(0)<wbr>, =
begin(v), end(v))</font></div><div><font face=3D"monospace, monospace">=C2=
=A0 =C2=A0 =C2=A0 =C2=A0; first !=3D last</font></div><div><font face=3D"mo=
nospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></div>=
<div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 {</font></div><div><=
font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 std::cout &l=
t;< "index: " << i << "\t" << *fir=
st << "\n";</font></div><div><font face=3D"monospace, monos=
pace">=C2=A0 =C2=A0 }</font></div><div><font face=3D"monospace, monospace">=
}</font></div></div><div><br></div><div>It seems sensible to me to group th=
e loop's variables in a structured binding since=C2=A0</div><div><br></=
div><ul><li>it's succinct and,</li><li>they remain firmly local to the =
loop's scope</li><li>It's the only way to declare multiple dissimil=
ar variables within the for statement.<br></li></ul><div><br></div><div>How=
ever, this code is not DRY - the naming of the bound variables must corresp=
ond to the creation of the tuple. Maintenance confusion awaits.<br></div></=
div></blockquote><div><br></div><div>Perhaps you're mistaking DRY for s=
ome other principle. DRY is Don't Repeat Yourself. This code involves n=
o repetition of typenames, variable names, objects, literals, or anything e=
lse. Nothing is being repeated; there is simply distance between the "=
variable" and its initializer.</div><div><br></div><div>That has nothi=
ng to do with repetition.<br></div></div></blockquote><div><br></div><div>F=
air enough, we'll settle on "distance". I think you'd agr=
ee that we'd prefer not to have this distance.<br></div><div>=C2=A0</di=
v><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:=
1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div><br></div=
><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div><=
/div><div>It seems to me that a small, non-breaking syntax change could all=
ow this:</div></div></blockquote><div><br></div><div>Structured binding sho=
uld not be used as a quick-and-dirty way to create multiple variables of di=
fferent types in a place where that wasn't possible previously. And we =
<i>certainly</i> should not add syntax to encourage this.</div></div></bloc=
kquote><div><br></div><div>This is sounding like unsubstansiated opinion. A=
nd I respectfully disagree - it seems useful to me to be able to create a t=
uple with named arguments in a local slope on the fly.<br></div></div></div=
></div></blockquote><div><br></div><div>And you can do that already. What w=
e shouldn't do is<i> encourage</i> it or hide the fact that this is wha=
t you're doing.</div><div><br></div><div>Here's the thing. The only=
time you absolutely<i> need</i> this feature is when you're declaring =
variables in a place where you only get one declaration. Because if you can=
make multiple declarations, there's nothing stopping you from doing:</=
div><div><br></div><div class=3D"prettyprint" style=3D"border: 1px solid rg=
b(187, 187, 187); word-wrap: break-word; background-color: rgb(250, 250, 25=
0);"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span class=
=3D"styled-by-prettify" style=3D"color: #008;">auto</span><span class=3D"st=
yled-by-prettify" style=3D"color: #000;"> i </span><span class=3D"styled-by=
-prettify" style=3D"color: #660;">=3D</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #000;"> size_t</span><span class=3D"styled-by-prettify"=
style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=3D=
"color: #066;">0</span><span class=3D"styled-by-prettify" style=3D"color: #=
660;">);</span><span class=3D"styled-by-prettify" style=3D"color: #000;"><b=
r></span><span class=3D"styled-by-prettify" style=3D"color: #008;">auto</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #000;"> first </span>=
<span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><span c=
lass=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"s=
tyled-by-prettify" style=3D"color: #008;">begin</span><span class=3D"styled=
-by-prettify" style=3D"color: #660;">(</span><span class=3D"styled-by-prett=
ify" style=3D"color: #000;">v</span><span class=3D"styled-by-prettify" styl=
e=3D"color: #660;">);</span><span class=3D"styled-by-prettify" style=3D"col=
or: #000;"><br></span><span class=3D"styled-by-prettify" style=3D"color: #0=
08;">auto</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> =
</span><span class=3D"styled-by-prettify" style=3D"color: #008;">last</span=
><span class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span cl=
ass=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><span class=3D"=
styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by=
-prettify" style=3D"color: #008;">end</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;">v</span><span class=3D"styled-by-prettify" style=3D"color=
: #660;">);</span></div></code></div><div><br></div><div>I find these lines=
to be far more readable than the structured binding version or your altern=
ative structured binding syntax. So the only time people should use your al=
ternate syntax is when they're only allowed a single declaration. And t=
hat means in the initializer section of some statement.</div><div><br></div=
><div>Do we really need to add special syntax for something that only gets =
used in such limited scenarios? Even worse, if we add such syntax, aren'=
;t we encouraging people to declare a bunch of variables in one line, which=
is generally considered bad form?</div><div><br></div><div>No, it's be=
st to just leave things as they are. In those circumstances where it is nec=
essary to achieve what you want, you can still do it. But the poor syntax a=
nd copying behavior will encourage you to avoid it whenever possible.</div>=
<div><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-=
left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr=
"><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div>Remember: they could have made `auto` do this exact thing whe=
n we standardized it in 2011. But the committee expressly decided against i=
t. All of the reasons for not allowing it then are still just as valid now.=
<br></div></div></blockquote><div><br></div><div>I am not privy to the reas=
ons. Are you able to elaborate please? I don't think structured binding=
s were on the table back in 2011.<br></div></div></div></div></blockquote><=
div><br></div><div>I didn't say structured bindings. I said `auto`.</di=
v><div><br></div><div>Remember: what you want<i> is not structured bindings=
</i>. Structured binding is about unpacking objects that store data into mu=
ltiple variable-like constructs. You don't have such a object, and you =
don't really want one. The only reason you created a tuple of values wa=
s because structured binding <i>requires</i> it.</div><div><br></div><div>W=
hat you really want is the ability to declare multiple variables of differe=
nt types in a single declaration statement. When `auto` was being standardi=
zed, there was discussion about allowing precisely that:</div><div><br></di=
v><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"styled-by-pre=
ttify" style=3D"color: #008;">auto</span><span class=3D"styled-by-prettify"=
style=3D"color: #000;"> x </span><span class=3D"styled-by-prettify" style=
=3D"color: #660;">=3D</span><span class=3D"styled-by-prettify" style=3D"col=
or: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #066;=
">5.0f</span><span class=3D"styled-by-prettify" style=3D"color: #660;">,</s=
pan><span class=3D"styled-by-prettify" style=3D"color: #000;"> y </span><sp=
an class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"styl=
ed-by-prettify" style=3D"color: #066;">10</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #660;">,</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #000;"> z </span><span class=3D"styled-by-prettify" style=3D=
"color: #660;">=3D</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"color: #008;">string=
</span><span class=3D"styled-by-prettify" style=3D"color: #660;">(</span><s=
pan class=3D"styled-by-prettify" style=3D"color: #080;">"foo"</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #660;">);</span><span=
class=3D"styled-by-prettify" style=3D"color: #000;"><br></span></div></cod=
e></div><br><div>These would deduce 3 different types for the 3 variables. =
The committee specifically decided<i> against</i> doing this.</div><div><br=
></div><div>Through structured bindings, you can achieve a similar effect a=
s that. But if we wanted that effect, we'd have allowed it to begin wit=
h.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0=
;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div di=
r=3D"ltr"><div><div class=3D"gmail_quote"><div></div><div><br></div><blockq=
uote class=3D"gmail_quote" style=3D"margin:0 0 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;border-left:1px #ccc solid;padding-left=
:1ex"><div dir=3D"ltr"><div><div><font face=3D"monospace, monospace">=C2=A0=
=C2=A0 for( auto [i =3D size_t(0), first =3D begin(v), last =3D end(v)]</f=
ont></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=
=A0; first !=3D last</font></div><div><font face=3D"monospace, monospace">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></div><div><font face=3D"m=
onospace, monospace">=C2=A0 =C2=A0 {</font></div><div><font face=3D"monospa=
ce, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 // ...</font></div><div><font fa=
ce=3D"monospace, monospace">=C2=A0 =C2=A0 }</font></div></div><div><font fa=
ce=3D"monospace, monospace"><br></font></div><div>which would:</div><div><b=
r></div><div>a) <b>be 100% DRY</b>,</div><div>b) involve less typing</div><=
/div></blockquote><div><br></div><div>59 characters vs. 79. That's not =
"much less", especially compared to the 45 characters in the rang=
e-based version.<br></div></div></blockquote><div><br></div><div>No, it'=
;s not "much less". It's "less", as I originally wr=
ote. However, perhaps we digress. The primary benefit (marked "a"=
and formatted in bold) is that it is DRY.</div></div></div></div></blockqu=
ote><div><br></div><div>But it isn't DRY; as we previously agreed, ther=
e's no repetition being eliminated. There is only distance.</div><div>=
=C2=A0</div><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"><=
div><div class=3D"gmail_quote"><div>Which I think we would all agree is a g=
ood thing (even if we disagree on the method to achieve it).<br></div></div=
></div></div></blockquote><div><br></div><div>No, not really. I don't w=
ant to see code like that, and I don't want to encourage people to have=
such long variable declaration sequences all in one statement like that.</=
div><div><br></div><div>If you're having to break a `for` loop or `if` =
statement or whatever into multiple lines just to make them legible, it sug=
gests that there's a problem in your code. The longer such statements g=
et, the harder it is to follow what's going on.</div><div><br></div><di=
v>Indeed, reducing such verbosity is partially why we created range-based `=
for` in the first place. The idiom you're talking about is not an anti-=
pattern per-se, but it ought to be considered a code smell. When you use it=
, it should be because there is no better way to do what you're doing.<=
/div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;ma=
rgin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/0dbd4344-23a7-4578-ad5c-e7727dfecf27%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/0dbd4344-23a7-4578-ad5c-e7727dfecf27=
%40isocpp.org</a>.<br />
------=_Part_395_357610886.1513184758274--
------=_Part_394_1861205341.1513184758273--
.
Author: Richard Hodges <hodges.r@gmail.com>
Date: Wed, 13 Dec 2017 23:21:52 +0100
Raw View
--001a113f6476cb28b105604031fd
Content-Type: text/plain; charset="UTF-8"
inline....
On 13 December 2017 at 18:05, Nicol Bolas <jmckesson@gmail.com> wrote:
> On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges wrote:
>>
>> answer inline
>>
>>
>> On 13 December 2017 at 16:26, Nicol Bolas <jmck...@gmail.com> wrote:
>>
>>> On Wednesday, December 13, 2017 at 5:15:56 AM UTC-5, Richard Hodges
>>> wrote:
>>>>
>>>> A simple example:
>>>>
>>>> Here's a fairly common idiom, expressed in terms of a structured
>>>> binding:
>>>>
>>>
>>> I'm sure some people do this, but an indexed range view would handle
>>> this much more easily and compactly:
>>>
>>
>> I had anticipated answers like this. Of course, there are other ways to
>> implement this specific idiom. I have used it as a simple example of
>> multiple initialisations of disparate types firmly within the scope of a
>> for-loop
>>
>>
>>>
>>> for(auto &[i, val] : std::counted_view(rng))
>>> {...}
>>>
>>> #include <iostream>
>>>> #include <vector>
>>>> #include <tuple>
>>>>
>>>> int main()
>>>> {
>>>> std::vector<int> v = { 6,5,4,3,2,1 };
>>>>
>>>> for( auto [i, first, last] = std::make_tuple(std::size_t(0),
>>>> begin(v), end(v))
>>>> ; first != last
>>>> ; ++i, ++first)
>>>> {
>>>> std::cout << "index: " << i << "\t" << *first << "\n";
>>>> }
>>>> }
>>>>
>>>> It seems sensible to me to group the loop's variables in a structured
>>>> binding since
>>>>
>>>>
>>>> - it's succinct and,
>>>> - they remain firmly local to the loop's scope
>>>> - It's the only way to declare multiple dissimilar variables within
>>>> the for statement.
>>>>
>>>>
>>>> However, this code is not DRY - the naming of the bound variables must
>>>> correspond to the creation of the tuple. Maintenance confusion awaits.
>>>>
>>>
>>> Perhaps you're mistaking DRY for some other principle. DRY is Don't
>>> Repeat Yourself. This code involves no repetition of typenames, variable
>>> names, objects, literals, or anything else. Nothing is being repeated;
>>> there is simply distance between the "variable" and its initializer.
>>>
>>> That has nothing to do with repetition.
>>>
>>
>> Fair enough, we'll settle on "distance". I think you'd agree that we'd
>> prefer not to have this distance.
>>
>>
>>>
>>> It seems to me that a small, non-breaking syntax change could allow this:
>>>>
>>>
>>> Structured binding should not be used as a quick-and-dirty way to create
>>> multiple variables of different types in a place where that wasn't possible
>>> previously. And we *certainly* should not add syntax to encourage this.
>>>
>>
>> This is sounding like unsubstansiated opinion. And I respectfully
>> disagree - it seems useful to me to be able to create a tuple with named
>> arguments in a local slope on the fly.
>>
>
> And you can do that already. What we shouldn't do is* encourage* it or
> hide the fact that this is what you're doing.
>
> Here's the thing. The only time you absolutely* need* this feature is
> when you're declaring variables in a place where you only get one
> declaration. Because if you can make multiple declarations, there's nothing
> stopping you from doing:
>
> auto i = size_t(0);
> auto first = begin(v);
> auto last = end(v);
>
> I find these lines to be far more readable than the structured binding
> version or your alternative structured binding syntax. So the only time
> people should use your alternate syntax is when they're only allowed a
> single declaration. And that means in the initializer section of some
> statement.
>
>
In current c++, in order to declare these variables one per line while
enclosing them strictly within the scope of the algorithm, once would need
to enclose the entire algorithm in a pair of logically un-neccessary curly
braces. Of course one way to do that is to enclose the entire construct in
a lambda or mini-function. However, this is not always desirable. Which of
course is why we have range-based for in addition to std::for_each().
> Do we really need to add special syntax for something that only gets used
> in such limited scenarios? Even worse, if we add such syntax, aren't we
> encouraging people to declare a bunch of variables in one line, which is
> generally considered bad form?
>
It seems to me that tuples have become a special kind of problem, in that
there is core language support for half of the construct, but library-only
support for the rest. Similarly initializer_list and typeinfo. I am of the
view that this is an aberration. Either support it in the core language or
don't. The current half and half approach is an error. why shouldn't I be
able to say:
auto t = auto [x = int(1), y = std::string("foo"), 6]; // get<0>(t) == 1,
get<1>(t) == "foo", get<2>(t) == 6
such an expression is expressive, succinct and useful. I can manipulate the
tuple either as a complete object or as individual objects. Great!
> No, it's best to just leave things as they are. In those circumstances
> where it is necessary to achieve what you want, you can still do it. But
> the poor syntax and copying behavior will encourage you to avoid it
> whenever possible.
>
An "it's best to leave things as they are" attitude would leave us with
c+98 and prevent c++ ever becoming a mature fully-featured expressive
language. I'm afraid to say that I cannot take this statement seriously.
>
> Remember: they could have made `auto` do this exact thing when we
>>> standardized it in 2011. But the committee expressly decided against it.
>>> All of the reasons for not allowing it then are still just as valid now.
>>>
>>
>> I am not privy to the reasons. Are you able to elaborate please? I don't
>> think structured bindings were on the table back in 2011.
>>
>
> I didn't say structured bindings. I said `auto`.
>
Mea culpa.
>
> Remember: what you want* is not structured bindings*. Structured binding
> is about unpacking objects that store data into multiple variable-like
> constructs. You don't have such a object, and you don't really want one.
> The only reason you created a tuple of values was because structured
> binding *requires* it.
>
> What you really want is the ability to declare multiple variables of
> different types in a single declaration statement. When `auto` was being
> standardized, there was discussion about allowing precisely that:
>
> auto x = 5.0f, y = 10, z = std::string("foo");
>
> These would deduce 3 different types for the 3 variables. The committee
> specifically decided* against* doing this.
>
Deciding against this seems to me to have been, in hindsight, the wrong
decision. Perhaps this error can be corrected in a future standard? I have
yet to see a reasonable rationalisation (in the light of since-gathered
experience) of this decision.
>
> Through structured bindings, you can achieve a similar effect as that. But
> if we wanted that effect, we'd have allowed it to begin with.
>
>
>> for( auto [i = size_t(0), first = begin(v), last = end(v)]
>>>> ; first != last
>>>> ; ++i, ++first)
>>>> {
>>>> // ...
>>>> }
>>>>
>>>> which would:
>>>>
>>>> a) *be 100% DRY*,
>>>> b) involve less typing
>>>>
>>>
>>> 59 characters vs. 79. That's not "much less", especially compared to the
>>> 45 characters in the range-based version.
>>>
>>
>> No, it's not "much less". It's "less", as I originally wrote. However,
>> perhaps we digress. The primary benefit (marked "a" and formatted in bold)
>> is that it is DRY.
>>
>
> But it isn't DRY; as we previously agreed, there's no repetition being
> eliminated. There is only distance.
>
We will have to disagree. I say the repetition is in the correlation of
numbers and positions of terms in the structured binding and the tuple
creation.
>
>
>> Which I think we would all agree is a good thing (even if we disagree on
>> the method to achieve it).
>>
>
> No, not really. I don't want to see code like that, and I don't want to
> encourage people to have such long variable declaration sequences all in
> one statement like that.
>
You are saying that you don't agree that DRY is a good thing on grounds of
aesthetics? This position seems indefensible to me.
>
> If you're having to break a `for` loop or `if` statement or whatever into
> multiple lines just to make them legible, it suggests that there's a
> problem in your code. The longer such statements get, the harder it is to
> follow what's going on.
>
I have to say that since variable names are often longer than 10
characters, breaking a for loop into 3 or so lines is almost always
inevitable.
>
> Indeed, reducing such verbosity is partially why we created range-based
> `for` in the first place. The idiom you're talking about is not an
> anti-pattern per-se, but it ought to be considered a code smell. When you
> use it, it should be because there is no better way to do what you're doing.
>
>
Range-based for solves exactly one class of common problem, not all of
them. It's useful, and thanks for creating it. But it's not useful for
everything. It's not that I am ungrateful. I simply happen to think we can
do even better.
--
> 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/0dbd4344-23a7-4578-
> ad5c-e7727dfecf27%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/0dbd4344-23a7-4578-ad5c-e7727dfecf27%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CALvx3hbnDnY%2BKEOeySnrSyGZnPjYjVvksAYB_v2_1c4yMnkWfA%40mail.gmail.com.
--001a113f6476cb28b105604031fd
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">inline....<br><div><div class=3D"gmail_extra"><br><div cla=
ss=3D"gmail_quote">On 13 December 2017 at 18:05, Nicol Bolas <span dir=3D"l=
tr"><<a href=3D"mailto:jmckesson@gmail.com" target=3D"_blank">jmckesson@=
gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><span class=3D"">On Wednesday, December 13, 2017 at 10:58:11 AM UT=
C-5, Richard Hodges wrote:</span><blockquote class=3D"gmail_quote" style=3D=
"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><d=
iv dir=3D"ltr">answer inline<div><div class=3D"h5"><br><div><br><div class=
=3D"gmail_quote">On 13 December 2017 at 16:26, Nicol Bolas <span dir=3D"ltr=
"><<a rel=3D"nofollow">jmck...@gmail.com</a>></span> wrote:<br><block=
quote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc=
solid;padding-left:1ex"><div dir=3D"ltr">On Wednesday, December 13, 2017 a=
t 5:15:56 AM UTC-5, Richard Hodges 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">A simple example:<br><br>Here's a fairly common =
idiom, expressed in terms of a structured binding:</div></blockquote><div><=
br></div><div>I'm sure some people do this, but an indexed range view w=
ould handle this much more easily and compactly:</div></div></blockquote><d=
iv><br></div><div>I had anticipated answers like this. Of course, there are=
other ways to implement this specific idiom. I have used it as a simple ex=
ample of multiple initialisations of disparate types firmly within the scop=
e of a for-loop<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote"=
style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><d=
iv dir=3D"ltr"><div><br></div><div style=3D"background-color:rgb(250,250,25=
0);border-color:rgb(187,187,187);border-style:solid;border-width:1px"><code=
><div><span style=3D"color:#008">for</span><span style=3D"color:#660">(</sp=
an><span style=3D"color:#008">auto</span><span style=3D"color:#000"> </span=
><span style=3D"color:#660">&[</span><span style=3D"color:#000">i</span=
><span style=3D"color:#660">,</span><span style=3D"color:#000"> val</span><=
span style=3D"color:#660">]</span><span style=3D"color:#000"> </span><span =
style=3D"color:#660">:</span><span style=3D"color:#000"> std</span><span st=
yle=3D"color:#660">::</span><span style=3D"color:#000">counted_view</span><=
span style=3D"color:#660">(</span><span style=3D"color:#000">rng</span><spa=
n style=3D"color:#660">))</span><span style=3D"color:#000"><br></span><span=
style=3D"color:#660">{...}</span><span style=3D"color:#000"><br></span></d=
iv></code></div><div><br></div><blockquote class=3D"gmail_quote" style=3D"m=
argin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div=
dir=3D"ltr"><div></div><div><div><font face=3D"monospace, monospace">#incl=
ude <iostream></font></div><div><font face=3D"monospace, monospace">#=
include <vector></font></div><div><font face=3D"monospace, monospace"=
>#include <tuple></font></div><div><font face=3D"monospace, monospace=
"><br></font></div><div><font face=3D"monospace, monospace">int main()</fon=
t></div><div><font face=3D"monospace, monospace">{</font></div><div><font f=
ace=3D"monospace, monospace">=C2=A0 =C2=A0 std::vector<int> v =3D { 6=
,5,4,3,2,1 };</font></div><div><font face=3D"monospace, monospace"><br></fo=
nt></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 for( auto [=
i, first, last] =3D std::make_tuple(std::size_t(0)<wbr>, begin(v), end(v))<=
/font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=A0 =
=C2=A0; first !=3D last</font></div><div><font face=3D"monospace, monospace=
">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></div><div><font face=3D=
"monospace, monospace">=C2=A0 =C2=A0 {</font></div><div><font face=3D"monos=
pace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 std::cout << "index=
: " << i << "\t" << *first << "=
\n";</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=
=A0 }</font></div><div><font face=3D"monospace, monospace">}</font></div></=
div><div><br></div><div>It seems sensible to me to group the loop's var=
iables in a structured binding since=C2=A0</div><div><br></div><ul><li>it&#=
39;s succinct and,</li><li>they remain firmly local to the loop's scope=
</li><li>It's the only way to declare multiple dissimilar variables wit=
hin the for statement.<br></li></ul><div><br></div><div>However, this code =
is not DRY - the naming of the bound variables must correspond to the creat=
ion of the tuple. Maintenance confusion awaits.<br></div></div></blockquote=
><div><br></div><div>Perhaps you're mistaking DRY for some other princi=
ple. DRY is Don't Repeat Yourself. This code involves no repetition of =
typenames, variable names, objects, literals, or anything else. Nothing is =
being repeated; there is simply distance between the "variable" a=
nd its initializer.</div><div><br></div><div>That has nothing to do with re=
petition.<br></div></div></blockquote><div><br></div><div>Fair enough, we&#=
39;ll settle on "distance". I think you'd agree that we'd=
prefer not to have this distance.<br></div><div>=C2=A0</div><blockquote cl=
ass=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;p=
adding-left:1ex"><div dir=3D"ltr"><div></div><div><br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc=
solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div></div><div>It see=
ms to me that a small, non-breaking syntax change could allow this:</div></=
div></blockquote><div><br></div><div>Structured binding should not be used =
as a quick-and-dirty way to create multiple variables of different types in=
a place where that wasn't possible previously. And we <i>certainly</i>=
should not add syntax to encourage this.</div></div></blockquote><div><br>=
</div><div>This is sounding like unsubstansiated opinion. And I respectfull=
y disagree - it seems useful to me to be able to create a tuple with named =
arguments in a local slope on the fly.<br></div></div></div></div></div></d=
iv></blockquote><div><br></div><div>And you can do that already. What we sh=
ouldn't do is<i> encourage</i> it or hide the fact that this is what yo=
u're doing.</div><div><br></div><div>Here's the thing. The only tim=
e you absolutely<i> need</i> this feature is when you're declaring vari=
ables in a place where you only get one declaration. Because if you can mak=
e multiple declarations, there's nothing stopping you from doing:</div>=
<div><br></div><div class=3D"m_787261639647159614prettyprint" style=3D"bord=
er:1px solid rgb(187,187,187);word-wrap:break-word;background-color:rgb(250=
,250,250)"><code class=3D"m_787261639647159614prettyprint"><div class=3D"m_=
787261639647159614subprettyprint"><span class=3D"m_787261639647159614styled=
-by-prettify" style=3D"color:#008">auto</span><span class=3D"m_787261639647=
159614styled-by-prettify" style=3D"color:#000"> i </span><span class=3D"m_7=
87261639647159614styled-by-prettify" style=3D"color:#660">=3D</span><span c=
lass=3D"m_787261639647159614styled-by-prettify" style=3D"color:#000"> size_=
t</span><span class=3D"m_787261639647159614styled-by-prettify" style=3D"col=
or:#660">(</span><span class=3D"m_787261639647159614styled-by-prettify" sty=
le=3D"color:#066">0</span><span class=3D"m_787261639647159614styled-by-pret=
tify" style=3D"color:#660">);</span><span class=3D"m_787261639647159614styl=
ed-by-prettify" style=3D"color:#000"><br></span><span class=3D"m_7872616396=
47159614styled-by-prettify" style=3D"color:#008">auto</span><span class=3D"=
m_787261639647159614styled-by-prettify" style=3D"color:#000"> first </span>=
<span class=3D"m_787261639647159614styled-by-prettify" style=3D"color:#660"=
>=3D</span><span class=3D"m_787261639647159614styled-by-prettify" style=3D"=
color:#000"> </span><span class=3D"m_787261639647159614styled-by-prettify" =
style=3D"color:#008">begin</span><span class=3D"m_787261639647159614styled-=
by-prettify" style=3D"color:#660">(</span><span class=3D"m_7872616396471596=
14styled-by-prettify" style=3D"color:#000">v</span><span class=3D"m_7872616=
39647159614styled-by-prettify" style=3D"color:#660">);</span><span class=3D=
"m_787261639647159614styled-by-prettify" style=3D"color:#000"><br></span><s=
pan class=3D"m_787261639647159614styled-by-prettify" style=3D"color:#008">a=
uto</span><span class=3D"m_787261639647159614styled-by-prettify" style=3D"c=
olor:#000"> </span><span class=3D"m_787261639647159614styled-by-prettify" s=
tyle=3D"color:#008">last</span><span class=3D"m_787261639647159614styled-by=
-prettify" style=3D"color:#000"> </span><span class=3D"m_787261639647159614=
styled-by-prettify" style=3D"color:#660">=3D</span><span class=3D"m_7872616=
39647159614styled-by-prettify" style=3D"color:#000"> </span><span class=3D"=
m_787261639647159614styled-by-prettify" style=3D"color:#008">end</span><spa=
n class=3D"m_787261639647159614styled-by-prettify" style=3D"color:#660">(</=
span><span class=3D"m_787261639647159614styled-by-prettify" style=3D"color:=
#000">v</span><span class=3D"m_787261639647159614styled-by-prettify" style=
=3D"color:#660">);</span></div></code></div><div><br></div><div>I find thes=
e lines to be far more readable than the structured binding version or your=
alternative structured binding syntax. So the only time people should use =
your alternate syntax is when they're only allowed a single declaration=
.. And that means in the initializer section of some statement.</div><div><b=
r></div></div></blockquote><div><br></div><div>In current c++, in order to =
declare these variables one per line while enclosing them strictly within t=
he scope of the algorithm, once would need to enclose the entire algorithm =
in a pair of logically un-neccessary curly braces. Of course one way to do =
that is to enclose the entire construct in a lambda or mini-function. Howev=
er, this is not always desirable. Which of course is why we have range-base=
d for in addition to std::for_each().<br></div><div>=C2=A0 <br></div><block=
quote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc=
solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>Do we really need=
to add special syntax for something that only gets used in such limited sc=
enarios? Even worse, if we add such syntax, aren't we encouraging peopl=
e to declare a bunch of variables in one line, which is generally considere=
d bad form?</div></div></blockquote><div><br></div><div>It seems to me that=
tuples have become a special kind of problem, in that there is core langua=
ge support for half of the construct, but library-only support for the rest=
.. Similarly initializer_list and typeinfo. I am of the view that this is an=
aberration. Either support it in the core language or don't. The curre=
nt half and half approach is an error. why shouldn't I be able to say:<=
/div><div><br></div><div><span style=3D"font-family:monospace,monospace">au=
to t =3D auto [x =3D int(1), y =3D std::string("foo"), 6];=C2=A0 =
// get<0>(t) =3D=3D 1, get<1>(t) =3D=3D "foo", get<=
;2>(t) =3D=3D 6<br></span></div><div>=C2=A0 <br></div><div>such an expre=
ssion is expressive, succinct and useful. I can manipulate the tuple either=
as a complete object or as individual objects. Great!</div><div><br></div>=
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>No, it&=
#39;s best to just leave things as they are. In those circumstances where i=
t is necessary to achieve what you want, you can still do it. But the poor =
syntax and copying behavior will encourage you to avoid it whenever possibl=
e.</div></div></blockquote><div><br></div><div>An "it's best to le=
ave things as they are" attitude would leave us with c+98 and prevent =
c++ ever becoming a mature fully-featured expressive language. I'm afra=
id to say that I cannot take this statement seriously.<br></div><div>=C2=A0=
</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-l=
eft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><span class=3D""><div=
><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:=
0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><d=
iv class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:=
0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><d=
iv>Remember: they could have made `auto` do this exact thing when we standa=
rdized it in 2011. But the committee expressly decided against it. All of t=
he reasons for not allowing it then are still just as valid now.<br></div><=
/div></blockquote><div><br></div><div>I am not privy to the reasons. Are yo=
u able to elaborate please? I don't think structured bindings were on t=
he table back in 2011.<br></div></div></div></div></blockquote><div><br></d=
iv></span><div>I didn't say structured bindings. I said `auto`.</div></=
div></blockquote><div><br></div><div>Mea culpa.<br></div><div>=C2=A0</div><=
blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px=
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Remember=
: what you want<i> is not structured bindings</i>. Structured binding is ab=
out unpacking objects that store data into multiple variable-like construct=
s. You don't have such a object, and you don't really want one. The=
only reason you created a tuple of values was because structured binding <=
i>requires</i> it.</div><div><br></div><div>What you really want is the abi=
lity to declare multiple variables of different types in a single declarati=
on statement. When `auto` was being standardized, there was discussion abou=
t allowing precisely that:</div><div><br></div><div class=3D"m_787261639647=
159614prettyprint" style=3D"border:1px solid rgb(187,187,187);word-wrap:bre=
ak-word;background-color:rgb(250,250,250)"><code class=3D"m_787261639647159=
614prettyprint"><div class=3D"m_787261639647159614subprettyprint"><span cla=
ss=3D"m_787261639647159614styled-by-prettify" style=3D"color:#008">auto</sp=
an><span class=3D"m_787261639647159614styled-by-prettify" style=3D"color:#0=
00"> x </span><span class=3D"m_787261639647159614styled-by-prettify" style=
=3D"color:#660">=3D</span><span class=3D"m_787261639647159614styled-by-pret=
tify" style=3D"color:#000"> </span><span class=3D"m_787261639647159614style=
d-by-prettify" style=3D"color:#066">5.0f</span><span class=3D"m_78726163964=
7159614styled-by-prettify" style=3D"color:#660">,</span><span class=3D"m_78=
7261639647159614styled-by-prettify" style=3D"color:#000"> y </span><span cl=
ass=3D"m_787261639647159614styled-by-prettify" style=3D"color:#660">=3D</sp=
an><span class=3D"m_787261639647159614styled-by-prettify" style=3D"color:#0=
00"> </span><span class=3D"m_787261639647159614styled-by-prettify" style=3D=
"color:#066">10</span><span class=3D"m_787261639647159614styled-by-prettify=
" style=3D"color:#660">,</span><span class=3D"m_787261639647159614styled-by=
-prettify" style=3D"color:#000"> z </span><span class=3D"m_7872616396471596=
14styled-by-prettify" style=3D"color:#660">=3D</span><span class=3D"m_78726=
1639647159614styled-by-prettify" style=3D"color:#000"> std</span><span clas=
s=3D"m_787261639647159614styled-by-prettify" style=3D"color:#660">::</span>=
<span class=3D"m_787261639647159614styled-by-prettify" style=3D"color:#008"=
>string</span><span class=3D"m_787261639647159614styled-by-prettify" style=
=3D"color:#660">(</span><span class=3D"m_787261639647159614styled-by-pretti=
fy" style=3D"color:#080">"foo"</span><span class=3D"m_78726163964=
7159614styled-by-prettify" style=3D"color:#660">);</span><span class=3D"m_7=
87261639647159614styled-by-prettify" style=3D"color:#000"><br></span></div>=
</code></div><br><div>These would deduce 3 different types for the 3 variab=
les. The committee specifically decided<i> against</i> doing this.</div></d=
iv></blockquote><div><br></div><div>Deciding against this seems to me to ha=
ve been, in hindsight, the wrong decision. Perhaps this error can be correc=
ted in a future standard? I have yet to see a reasonable rationalisation (i=
n the light of since-gathered experience) of this decision.<br></div><div>=
=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div>=
<div>Through structured bindings, you can achieve a similar effect as that.=
But if we wanted that effect, we'd have allowed it to begin with.</div=
><span class=3D""><div><br></div><blockquote class=3D"gmail_quote" style=3D=
"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><d=
iv dir=3D"ltr"><div><div class=3D"gmail_quote"><div></div><div><br></div><b=
lockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px =
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding=
-left:1ex"><div dir=3D"ltr"><div><div><font face=3D"monospace, monospace">=
=C2=A0 =C2=A0 for( auto [i =3D size_t(0), first =3D begin(v), last =3D end(=
v)]</font></div><div><font face=3D"monospace, monospace">=C2=A0 =C2=A0 =C2=
=A0 =C2=A0; first !=3D last</font></div><div><font face=3D"monospace, monos=
pace">=C2=A0 =C2=A0 =C2=A0 =C2=A0; ++i, ++first)</font></div><div><font fac=
e=3D"monospace, monospace">=C2=A0 =C2=A0 {</font></div><div><font face=3D"m=
onospace, monospace">=C2=A0 =C2=A0 =C2=A0 =C2=A0 // ...</font></div><div><f=
ont face=3D"monospace, monospace">=C2=A0 =C2=A0 }</font></div></div><div><f=
ont face=3D"monospace, monospace"><br></font></div><div>which would:</div><=
div><br></div><div>a) <b>be 100% DRY</b>,</div><div>b) involve less typing<=
/div></div></blockquote><div><br></div><div>59 characters vs. 79. That'=
s not "much less", especially compared to the 45 characters in th=
e range-based version.<br></div></div></blockquote><div><br></div><div>No, =
it's not "much less". It's "less", as I origina=
lly wrote. However, perhaps we digress. The primary benefit (marked "a=
" and formatted in bold) is that it is DRY.</div></div></div></div></b=
lockquote><div><br></div></span><div>But it isn't DRY; as we previously=
agreed, there's no repetition being eliminated. There is only distance=
..</div></div></blockquote><div><br></div><div>We will have to disagree. I s=
ay the repetition is in the correlation of numbers and positions of terms i=
n the structured binding and the tuple creation.<br></div><div>=C2=A0</div>=
<blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div dir=3D"ltr"><span class=3D""><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.=
8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div=
class=3D"gmail_quote"><div>Which I think we would all agree is a good thin=
g (even if we disagree on the method to achieve it).<br></div></div></div><=
/div></blockquote><div><br></div></span><div>No, not really. I don't wa=
nt to see code like that, and I don't want to encourage people to have =
such long variable declaration sequences all in one statement like that.</d=
iv></div></blockquote><div><br></div><div>You are saying that you don't=
agree that DRY is a good thing on grounds of aesthetics? This position see=
ms indefensible to me.<br></div><div>=C2=A0</div><blockquote class=3D"gmail=
_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:=
1ex"><div dir=3D"ltr"><div><br></div><div>If you're having to break a `=
for` loop or `if` statement or whatever into multiple lines just to make th=
em legible, it suggests that there's a problem in your code. The longer=
such statements get, the harder it is to follow what's going on.</div>=
</div></blockquote><div><br></div><div>I have to say that since variable na=
mes are often longer than 10 characters, breaking a for loop into 3 or so l=
ines is almost always inevitable.<br></div><div>=C2=A0</div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;pa=
dding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Indeed, reducing such =
verbosity is partially why we created range-based `for` in the first place.=
The idiom you're talking about is not an anti-pattern per-se, but it o=
ught to be considered a code smell. When you use it, it should be because t=
here is no better way to do what you're doing.</div><div><br></div></di=
v></blockquote><div><br></div><div>Range-based for solves exactly one class=
of common problem, not all of them. It's useful, and thanks for creati=
ng it. But it's not useful for everything. It's not that I am ungra=
teful. I simply happen to think we can do even better.</div><div><br></div>=
<div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex=
;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><=
blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border=
-left:1px #ccc solid;padding-left:1ex">
</blockquote></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/0dbd4344-23a7-4578-ad5c-e7727dfecf27%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/0dbd=
4344-23a7-4578-<wbr>ad5c-e7727dfecf27%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CALvx3hbnDnY%2BKEOeySnrSyGZnPjYjVvksA=
YB_v2_1c4yMnkWfA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hbnDnY%2B=
KEOeySnrSyGZnPjYjVvksAYB_v2_1c4yMnkWfA%40mail.gmail.com</a>.<br />
--001a113f6476cb28b105604031fd--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Wed, 13 Dec 2017 15:48:47 -0800 (PST)
Raw View
------=_Part_770_1105880123.1513208927336
Content-Type: multipart/alternative;
boundary="----=_Part_771_1118525868.1513208927337"
------=_Part_771_1118525868.1513208927337
Content-Type: text/plain; charset="UTF-8"
On Wednesday, December 13, 2017 at 5:22:11 PM UTC-5, Richard Hodges wrote:
>
> inline....
>
> On 13 December 2017 at 18:05, Nicol Bolas <*jmck...@gmail.com*
> <javascript:>> wrote:
>
>> On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges
>> wrote:
>>>
>>> answer inline
>>>
>>>
>>>> It seems to me that a small, non-breaking syntax change could allow
>>>>> this:
>>>>>
>>>>
>>>> Structured binding should not be used as a quick-and-dirty way to
>>>> create multiple variables of different types in a place where that wasn't
>>>> possible previously. And we *certainly* should not add syntax to
>>>> encourage this.
>>>>
>>>
>>> This is sounding like unsubstansiated opinion. And I respectfully
>>> disagree - it seems useful to me to be able to create a tuple with named
>>> arguments in a local slope on the fly.
>>>
>>
>> And you can do that already. What we shouldn't do is* encourage* it or
>> hide the fact that this is what you're doing.
>>
>> Here's the thing. The only time you absolutely* need* this feature is
>> when you're declaring variables in a place where you only get one
>> declaration. Because if you can make multiple declarations, there's nothing
>> stopping you from doing:
>>
>> auto i = size_t(0);
>> auto first = begin(v);
>> auto last = end(v);
>>
>> I find these lines to be far more readable than the structured binding
>> version or your alternative structured binding syntax. So the only time
>> people should use your alternate syntax is when they're only allowed a
>> single declaration. And that means in the initializer section of some
>> statement.
>>
>>
> In current c++, in order to declare these variables one per line while
> enclosing them strictly within the scope of the algorithm, once would need
> to enclose the entire algorithm in a pair of logically un-neccessary curly
> braces.
>
.... huh? If you have some variables that are "strictly within the scope of
the algorithm", then that algorithm must already have *scope*. So where
would these "logically un-neccessary curly braces" need to come from?
Unless "scope of the algorithm" should somehow not involve a C++ scope.
And if the algorithm's scope isn't bounded by C++ scope, what does it
matter if its one variable or 20; none of these variables are strictly
within the scope of the algorithm. They are within the C++ scope, which
we've just stated isn't the algorithm's scope.
Do we really need to add special syntax for something that only gets used
>> in such limited scenarios? Even worse, if we add such syntax, aren't we
>> encouraging people to declare a bunch of variables in one line, which is
>> generally considered bad form?
>>
>
> It seems to me that tuples have become a special kind of problem, in that
> there is core language support for half of the construct, but library-only
> support for the rest.
>
There is no core language support for any part of `tuple`. What we have is
core language support for *decomposition*, and `std::tuple` is a
decomposable type. But any user-created type can be decomposable with the
right definition or machinery.
Don't think of structured binding as a thing that works on tuples, with
tuples, or is about tuples.
Similarly initializer_list and typeinfo. I am of the view that this is an
> aberration.
>
I don't even know what you're talking about with these. `type_info` is a
C++ object returned by `typeid`, which allows basic queries about types to
work without creating some new C++ construct that you have to define a
bunch of rules for. `initializer_list` is much the same.
> Either support it in the core language or don't. The current half and half
> approach is an error. why shouldn't I be able to say:
>
> auto t = auto [x = int(1), y = std::string("foo"), 6]; // get<0>(t) == 1,
> get<1>(t) == "foo", get<2>(t) == 6
>
> such an expression is expressive, succinct and useful. I can manipulate
> the tuple either as a complete object or as individual objects. Great!
>
I fail to see how that is an improvement over using a tuple. And quite
frankly, we already have ways of declaring a type:
struct {int x = 1; std::string y{"foo"}; int z = 6;} t;
Oh sure, you can't leave a member unnamed, but why would you* want to*? If
that member is important enough to be stored and accessed, it's important
enough to have a name.
`std::tuple` primarily exists for metaprogramming reasons (building
structs, etc). If you're using it in static code like the declaration
above, you're almost always using the wrong tool.
No, it's best to just leave things as they are. In those circumstances
>> where it is necessary to achieve what you want, you can still do it. But
>> the poor syntax and copying behavior will encourage you to avoid it
>> whenever possible.
>>
>
> An "it's best to leave things as they are" attitude would leave us with
> c+98 and prevent c++ ever becoming a mature fully-featured expressive
> language. I'm afraid to say that I cannot take this statement seriously.
>
I didn't say we should leave all of C++ as it is. I'm saying that we should
leave *this* as it is.
My problems with this really boil down to (in priority order):
1) It abuses structured binding, forcing it to do something that structured
binding isn't meant to do simply because it is convenient syntax.
2) The problems this solves are not encountered frequently enough to
override #1.
3) In a lot of the practical cases where this might be useful, there are
better solutions that don't need it (like my range adaptor example).
4) It encourages writing ugly code. The more variables you shove into a
`for` initializer, the more testing and incrementing expressions you need
and the harder it is to follow the logic. This is a big part of why the
range adaptor is preferred where possible; it hides the ugly details.
Remember: they could have made `auto` do this exact thing when we
>>>> standardized it in 2011. But the committee expressly decided against it.
>>>> All of the reasons for not allowing it then are still just as valid now.
>>>>
>>>
>>> I am not privy to the reasons. Are you able to elaborate please? I don't
>>> think structured bindings were on the table back in 2011.
>>>
>>
>> I didn't say structured bindings. I said `auto`.
>>
>
> Mea culpa.
>
>
>>
>> Remember: what you want* is not structured bindings*. Structured binding
>> is about unpacking objects that store data into multiple variable-like
>> constructs. You don't have such a object, and you don't really want one.
>> The only reason you created a tuple of values was because structured
>> binding *requires* it.
>>
>> What you really want is the ability to declare multiple variables of
>> different types in a single declaration statement. When `auto` was being
>> standardized, there was discussion about allowing precisely that:
>>
>> auto x = 5.0f, y = 10, z = std::string("foo");
>>
>> These would deduce 3 different types for the 3 variables. The committee
>> specifically decided* against* doing this.
>>
>
> Deciding against this seems to me to have been, in hindsight, the wrong
> decision. Perhaps this error can be corrected in a future standard?
>
Well, changing it is possible. At present, [dcl.spec.auto]/7 says:
> The type of each declared variable is determined by placeholder type
deduction (10.1.7.4.1), and if the type that replaces the placeholder type
is not the same in each deduction, the program is ill-formed.
This means that every declaration which would deduce different types is at
present illegal. So removing this restriction would not break any currently
legal code.
And this change would be a *lot* more palatable than (ab)using structured
binding for this purpose. It would also have semantics that are more
immediately obvious than those for (ab)using structured binding in this way.
Though personally, I still think it's a bad idea.
I have yet to see a reasonable rationalisation (in the light of
> since-gathered experience) of this decision.
>
It's you who have to come up with a rationalization *for* the change, not
the other way around. If "the light of since-gathered experience" really is
on your side, you ought to be able to look at all of the old arguments
against it and answer them one-by-one based on that experience.
Be sure to bring up the Range TS Iterator/Sentinel paradigm. That's *always*
a slam-dunk when it comes to deducing the same type ;)
The `auto` proposals for C++11 are all still available from the committee's
website. Feel free to download them and start working through the
counter-arguments.
--
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/c8d3dd9a-69c7-4586-b0d3-cec9122c8b6a%40isocpp.org.
------=_Part_771_1118525868.1513208927337
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Wednesday, December 13, 2017 at 5:22:11 PM UTC-5, Richa=
rd Hodges 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"lt=
r">inline....<br><div><div><br><div class=3D"gmail_quote">On 13 December 20=
17 at 18:05, Nicol Bolas <span dir=3D"ltr"><<a onmousedown=3D"this.href=
=3D'javascript:';return true;" onclick=3D"this.href=3D'javascri=
pt:';return true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofoll=
ow" gdf-obfuscated-mailto=3D"u-6b9GCkAAAJ"><u><font color=3D"#0066cc">jmck.=
...@gmail.com</font></u></a>></span> wrote:<br><blockquote class=3D"gmail=
_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:=
1ex"><div dir=3D"ltr"><span>On Wednesday, December 13, 2017 at 10:58:11 AM =
UTC-5, Richard Hodges wrote:</span><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">answer inline<div><div><div><div class=3D"gmail_quote"><d=
iv><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;b=
order-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div=
><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div><=
/div><div>It seems to me that a small, non-breaking syntax change could all=
ow this:</div></div></blockquote><div><br></div><div>Structured
binding should not be used as a quick-and-dirty way to create multiple=20
variables of different types in a place where that wasn't possible=20
previously. And we <i>certainly</i> should not add syntax to encourage this=
..</div></div></blockquote><div><br></div><div>This
is sounding like unsubstansiated opinion. And I respectfully disagree -
it seems useful to me to be able to create a tuple with named arguments
in a local slope on the fly.<br></div></div></div></div></div></div></bloc=
kquote><div><br></div><div>And you can do that already. What we shouldn'=
;t do is<i> encourage</i> it or hide the fact that this is what you're =
doing.</div><div><br></div><div>Here's the thing. The only time you abs=
olutely<i> need</i>
this feature is when you're declaring variables in a place where you=
=20
only get one declaration. Because if you can make multiple declarations,
there's nothing stopping you from doing:</div><div><br></div><div styl=
e=3D"border:1px solid rgb(187,187,187);word-wrap:break-word;background-colo=
r:rgb(250,250,250)"><code><div><span style=3D"color:#008">auto</span><span =
style=3D"color:#000"> i </span><span style=3D"color:#660">=3D</span><span s=
tyle=3D"color:#000"> size_t</span><span style=3D"color:#660">(</span><span =
style=3D"color:#066">0</span><span style=3D"color:#660">);</span><span styl=
e=3D"color:#000"><br></span><span style=3D"color:#008">auto</span><span sty=
le=3D"color:#000"> first </span><span style=3D"color:#660">=3D</span><span =
style=3D"color:#000"> </span><span style=3D"color:#008">begin</span><span s=
tyle=3D"color:#660">(</span><span style=3D"color:#000">v</span><span style=
=3D"color:#660">);</span><span style=3D"color:#000"><br></span><span style=
=3D"color:#008">auto</span><span style=3D"color:#000"> </span><span style=
=3D"color:#008">last</span><span style=3D"color:#000"> </span><span style=
=3D"color:#660">=3D</span><span style=3D"color:#000"> </span><span style=3D=
"color:#008">end</span><span style=3D"color:#660">(</span><span style=3D"co=
lor:#000">v</span><span style=3D"color:#660">);</span></div></code></div><d=
iv><br></div><div>I
find these lines to be far more readable than the structured binding=20
version or your alternative structured binding syntax. So the only time=20
people should use your alternate syntax is when they're only allowed a=
=20
single declaration. And that means in the initializer section of some=20
statement.</div><div><br></div></div></blockquote><div><br></div><div>In
current c++, in order to declare these variables one per line while=20
enclosing them strictly within the scope of the algorithm, once would=20
need to enclose the entire algorithm in a pair of logically=20
un-neccessary curly braces.</div></div></div></div></div></blockquote><div>=
<br></div><div>...
huh? If you have some variables that are "strictly within the scope o=
f=20
the algorithm", then that algorithm must already have <i>scope</i>. So=
=20
where would these "logically un-neccessary curly braces" need to =
come=20
from? Unless "scope of the algorithm" should somehow not involve =
a C++ scope.</div><div><br></div><div>And
if the algorithm's scope isn't bounded by C++ scope, what does it=
=20
matter if its one variable or 20; none of these variables are strictly=20
within the scope of the algorithm. They are within the C++ scope, which=20
we've just stated isn't the algorithm's scope.<br></div><div><b=
r></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>=
<div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"=
margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"=
ltr"><div></div><div>Do
we really need to add special syntax for something that only gets used=20
in such limited scenarios? Even worse, if we add such syntax, aren't we=
=20
encouraging people to declare a bunch of variables in one line, which is
generally considered bad form?</div></div></blockquote><div><br></div><div=
>It
seems to me that tuples have become a special kind of problem, in that=20
there is core language support for half of the construct, but=20
library-only support for the rest.</div></div></div></div></div></blockquot=
e><div><br></div><div>There is no core language support for any part of `tu=
ple`. What we have is core language support for <i>decomposition</i>, and `=
std::tuple` is a decomposable type. But any user-created type can be decomp=
osable with the right definition or machinery.</div><div><br></div><div>Don=
't think of structured binding as a thing that works on tuples, with tu=
ples, or is about tuples.<br></div><div><br></div><blockquote class=3D"gmai=
l_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;=
padding-left: 1ex;"><div dir=3D"ltr"><div><div><div class=3D"gmail_quote"><=
div>Similarly initializer_list and typeinfo. I am of the view that this is =
an aberration.</div></div></div></div></div></blockquote><div><br></div><di=
v>I
don't even know what you're talking about with these. `type_info` =
is a=20
C++ object returned by `typeid`, which allows basic queries about types=20
to work without creating some new C++ construct that you have to define a
bunch of rules for. `initializer_list` is much the same.<br></div><div>=C2=
=A0</div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: =
0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div=
><div><div class=3D"gmail_quote"><div>Either support it in the core languag=
e or don't. The current half and half approach is an error. why shouldn=
't I be able to say:</div><div><br></div><div><span style=3D"font-famil=
y:monospace,monospace">auto t =3D auto [x =3D int(1), y =3D std::string(&qu=
ot;foo"), 6];=C2=A0 // get<0>(t) =3D=3D 1, get<1>(t) =3D=
=3D "foo", get<2>(t) =3D=3D 6<br></span></div><div>=C2=A0 <=
br></div><div>such
an expression is expressive, succinct and useful. I can manipulate the=20
tuple either as a complete object or as individual objects. Great!</div></d=
iv></div></div></div></blockquote><div><br></div><div>I fail to see how tha=
t is an improvement over using a tuple. And quite frankly, we already have =
ways of declaring a type:</div><div><br></div><div class=3D"prettyprint" st=
yle=3D"background-color: rgb(250, 250, 250); border-color: rgb(187, 187, 18=
7); border-style: solid; border-width: 1px; overflow-wrap: break-word;"><co=
de class=3D"prettyprint"><div class=3D"subprettyprint"><span class=3D"style=
d-by-prettify" style=3D"color: #008;">struct</span><span class=3D"styled-by=
-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify=
" style=3D"color: #660;">{</span><span class=3D"styled-by-prettify" style=
=3D"color: #008;">int</span><span class=3D"styled-by-prettify" style=3D"col=
or: #000;"> x </span><span class=3D"styled-by-prettify" style=3D"color: #66=
0;">=3D</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </=
span><span class=3D"styled-by-prettify" style=3D"color: #066;">1</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #660;">;</span><span class=
=3D"styled-by-prettify" style=3D"color: #000;"> std</span><span class=3D"st=
yled-by-prettify" style=3D"color: #660;">::</span><span class=3D"styled-by-=
prettify" style=3D"color: #008;">string</span><span class=3D"styled-by-pret=
tify" style=3D"color: #000;"> y</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #660;">{</span><span class=3D"styled-by-prettify" style=3D"co=
lor: #080;">"foo"</span><span class=3D"styled-by-prettify" style=
=3D"color: #660;">};</span><span class=3D"styled-by-prettify" style=3D"colo=
r: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #008;"=
>int</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> z </s=
pan><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><sp=
an class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=
=3D"styled-by-prettify" style=3D"color: #066;">6</span><span class=3D"style=
d-by-prettify" style=3D"color: #660;">;}</span><span class=3D"styled-by-pre=
ttify" style=3D"color: #000;"> t</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #660;">;</span></div></code></div><div><br></div><div>Oh sur=
e, you can't leave a member unnamed, but why would you<i> want to</i>? =
If that member is important enough to be stored and accessed, it's impo=
rtant enough to have a name.</div><div><br></div><div>`std::tuple` primaril=
y exists for metaprogramming reasons (building structs, etc). If you're=
using it in static code like the declaration above, you're almost alwa=
ys using the wrong tool.<br></div><div><br></div><blockquote class=3D"gmail=
_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;p=
adding-left: 1ex;"><div dir=3D"ltr"><div><div><div class=3D"gmail_quote"><d=
iv></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;borde=
r-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div>No=
,
it's best to just leave things as they are. In those circumstances=20
where it is necessary to achieve what you want, you can still do it. But
the poor syntax and copying behavior will encourage you to avoid it=20
whenever possible.</div></div></blockquote><div><br></div><div>An "it&=
#39;s=20
best to leave things as they are" attitude would leave us with c+98 an=
d=20
prevent c++ ever becoming a mature fully-featured expressive language.=20
I'm afraid to say that I cannot take this statement seriously.<br></div=
></div></div></div></div></blockquote><div><br></div><div>I didn't say =
we should leave all of C++ as it is. I'm saying that we should leave <i=
>this</i> as it is.</div><div><br></div><div>My problems with this really b=
oil down to (in priority order):</div><div><br></div><div>1) It abuses stru=
ctured binding, forcing it to do something that structured binding isn'=
t meant to do simply because it is convenient syntax.</div><div><br></div><=
div>2) The problems this solves are not encountered frequently enough to ov=
erride #1.</div><div><br></div><div>3) In a lot of the practical cases wher=
e this might be useful, there are better solutions that don't need it (=
like my range adaptor example).</div><div><br></div><div>4) It encourages w=
riting ugly code. The more variables you shove into a `for` initializer, th=
e more testing and incrementing expressions you need and the harder it is t=
o follow the logic. This is a big part of why the range adaptor is preferre=
d where possible; it hides the ugly details.<br></div><div><br></div><block=
quote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-le=
ft: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><div><div clas=
s=3D"gmail_quote"><div></div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr=
"><span><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8=
ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div =
class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0 0=
0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>=
Remember:
they could have made `auto` do this exact thing when we standardized it
in 2011. But the committee expressly decided against it. All of the=20
reasons for not allowing it then are still just as valid now.<br></div></di=
v></blockquote><div><br></div><div>I
am not privy to the reasons. Are you able to elaborate please? I don't=
=20
think structured bindings were on the table back in 2011.<br></div></div></=
div></div></blockquote><div><br></div></span><div>I didn't say structur=
ed bindings. I said `auto`.</div></div></blockquote><div><br></div><div>Mea=
culpa.<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div>Remember: what you want<i> is not structured b=
indings</i>.
Structured binding is about unpacking objects that store data into=20
multiple variable-like constructs. You don't have such a object, and yo=
u
don't really want one. The only reason you created a tuple of values=
=20
was because structured binding <i>requires</i> it.</div><div><br></div><div=
>What
you really want is the ability to declare multiple variables of=20
different types in a single declaration statement. When `auto` was being
standardized, there was discussion about allowing precisely that:</div><di=
v><br></div><div style=3D"border:1px solid rgb(187,187,187);word-wrap:break=
-word;background-color:rgb(250,250,250)"><code><div><span style=3D"color:#0=
08">auto</span><span style=3D"color:#000"> x </span><span style=3D"color:#6=
60">=3D</span><span style=3D"color:#000"> </span><span style=3D"color:#066"=
>5.0f</span><span style=3D"color:#660">,</span><span style=3D"color:#000"> =
y </span><span style=3D"color:#660">=3D</span><span style=3D"color:#000"> <=
/span><span style=3D"color:#066">10</span><span style=3D"color:#660">,</spa=
n><span style=3D"color:#000"> z </span><span style=3D"color:#660">=3D</span=
><span style=3D"color:#000"> std</span><span style=3D"color:#660">::</span>=
<span style=3D"color:#008">string</span><span style=3D"color:#660">(</span>=
<span style=3D"color:#080">"foo"</span><span style=3D"color:#660"=
>);</span><span style=3D"color:#000"><br></span></div></code></div><br><div=
>These would deduce 3 different types for the 3 variables. The committee sp=
ecifically decided<i> against</i> doing this.</div></div></blockquote><div>=
<br></div><div>Deciding
against this seems to me to have been, in hindsight, the wrong=20
decision. Perhaps this error can be corrected in a future standard?</div></=
div></div></div></div></blockquote><div><br></div><div>Well, changing it is=
possible. At present, [dcl.spec.auto]/7 says:</div><div><br></div><div>>=
;
The type of each declared variable is determined by placeholder type=20
deduction (10.1.7.4.1), and if the type that replaces the placeholder=20
type is not the same in each deduction, the program is ill-formed.</div><di=
v><br></div><div>This
means that every declaration which would deduce different types is at=20
present illegal. So removing this restriction would not break any=20
currently legal code.</div><div><br></div><div>And this change would be a <=
i>lot</i>
more palatable than (ab)using structured binding for this purpose. It=20
would also have semantics that are more immediately obvious than those=20
for (ab)using structured binding in this way.<br></div><div><br></div><div>=
Though personally, I still think it's a bad idea.<br></div><div><br></d=
iv><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;=
border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><div>=
<div class=3D"gmail_quote"><div>I have yet to see a reasonable rationalisat=
ion (in the light of since-gathered experience) of this decision.<br></div>=
</div></div></div></div></blockquote><div><br></div><div>It's you who h=
ave to come up with a rationalization <i>for</i>
the change, not the other way around. If "the light of since-gathered=
=20
experience" really is on your side, you ought to be able to look at al=
l=20
of the old arguments against it and answer them one-by-one based on that
experience.</div><div><br></div><div>Be sure to bring up the Range TS Iter=
ator/Sentinel paradigm. That's <i>always</i> a slam-dunk when it comes =
to deducing the same type ;)<br></div><div><br></div><div>The
`auto` proposals for C++11 are all still available from the committee'=
s
website. Feel free to download them and start working through the=20
counter-arguments.<br></div><div><br></div><blockquote class=3D"gmail_quote=
" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding=
-left: 1ex;">
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/c8d3dd9a-69c7-4586-b0d3-cec9122c8b6a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/c8d3dd9a-69c7-4586-b0d3-cec9122c8b6a=
%40isocpp.org</a>.<br />
------=_Part_771_1118525868.1513208927337--
------=_Part_770_1105880123.1513208927336--
.
Author: Richard Hodges <hodges.r@gmail.com>
Date: Thu, 14 Dec 2017 08:27:36 +0100
Raw View
--001a113f27aa794c9a056047d1a4
Content-Type: text/plain; charset="UTF-8"
I won't dwell too much, just a couple of comments:
On 14 December 2017 at 00:48, Nicol Bolas <jmckesson@gmail.com> wrote:
> On Wednesday, December 13, 2017 at 5:22:11 PM UTC-5, Richard Hodges wrote:
>>
>> inline....
>>
>> On 13 December 2017 at 18:05, Nicol Bolas <*jmck...@gmail.com*> wrote:
>>
>>> On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges
>>> wrote:
>>>>
>>>> answer inline
>>>>
>>>>
>>>>> It seems to me that a small, non-breaking syntax change could allow
>>>>>> this:
>>>>>>
>>>>>
>>>>> Structured binding should not be used as a quick-and-dirty way to
>>>>> create multiple variables of different types in a place where that wasn't
>>>>> possible previously. And we *certainly* should not add syntax to
>>>>> encourage this.
>>>>>
>>>>
>>>> This is sounding like unsubstansiated opinion. And I respectfully
>>>> disagree - it seems useful to me to be able to create a tuple with named
>>>> arguments in a local slope on the fly.
>>>>
>>>
>>> And you can do that already. What we shouldn't do is* encourage* it or
>>> hide the fact that this is what you're doing.
>>>
>>> Here's the thing. The only time you absolutely* need* this feature is
>>> when you're declaring variables in a place where you only get one
>>> declaration. Because if you can make multiple declarations, there's nothing
>>> stopping you from doing:
>>>
>>> auto i = size_t(0);
>>> auto first = begin(v);
>>> auto last = end(v);
>>>
>>> I find these lines to be far more readable than the structured binding
>>> version or your alternative structured binding syntax. So the only time
>>> people should use your alternate syntax is when they're only allowed a
>>> single declaration. And that means in the initializer section of some
>>> statement.
>>>
>>>
>> In current c++, in order to declare these variables one per line while
>> enclosing them strictly within the scope of the algorithm, once would need
>> to enclose the entire algorithm in a pair of logically un-neccessary curly
>> braces.
>>
>
> ... huh? If you have some variables that are "strictly within the scope of
> the algorithm", then that algorithm must already have *scope*. So where
> would these "logically un-neccessary curly braces" need to come from?
> Unless "scope of the algorithm" should somehow not involve a C++ scope.
>
> And if the algorithm's scope isn't bounded by C++ scope, what does it
> matter if its one variable or 20; none of these variables are strictly
> within the scope of the algorithm. They are within the C++ scope, which
> we've just stated isn't the algorithm's scope.
>
> Do we really need to add special syntax for something that only gets used
>>> in such limited scenarios? Even worse, if we add such syntax, aren't we
>>> encouraging people to declare a bunch of variables in one line, which is
>>> generally considered bad form?
>>>
>>
>> It seems to me that tuples have become a special kind of problem, in that
>> there is core language support for half of the construct, but library-only
>> support for the rest.
>>
>
> There is no core language support for any part of `tuple`. What we have is
> core language support for *decomposition*, and `std::tuple` is a
> decomposable type. But any user-created type can be decomposable with the
> right definition or machinery.
>
> Don't think of structured binding as a thing that works on tuples, with
> tuples, or is about tuples.
>
> Similarly initializer_list and typeinfo. I am of the view that this is an
>> aberration.
>>
>
> I don't even know what you're talking about with these. `type_info` is a
> C++ object returned by `typeid`, which allows basic queries about types to
> work without creating some new C++ construct that you have to define a
> bunch of rules for. `initializer_list` is much the same.
>
>
>> Either support it in the core language or don't. The current half and
>> half approach is an error. why shouldn't I be able to say:
>>
>> auto t = auto [x = int(1), y = std::string("foo"), 6]; // get<0>(t) ==
>> 1, get<1>(t) == "foo", get<2>(t) == 6
>>
>> such an expression is expressive, succinct and useful. I can manipulate
>> the tuple either as a complete object or as individual objects. Great!
>>
>
> I fail to see how that is an improvement over using a tuple. And quite
> frankly, we already have ways of declaring a type:
>
> struct {int x = 1; std::string y{"foo"}; int z = 6;} t;
>
>
Declaring an object of on-the-fly struct would be a solution if a struct's
members could be declared auto. Unhappily they cannot, so this solution
would only work where types are well known. Of course the argument for
introducing auto hinged on convenience of type deduction, particularly in
template expansions. This is a convenience I think we all enjoy. I would
like to see this kind of convenience extended.
As a side note, there is exactly one core language feature in which the
types of members is automatically deduced - the lambda with capture. The
automatic deduction is useful in this case, it might well be in others.
> Oh sure, you can't leave a member unnamed, but why would you* want to*?
> If that member is important enough to be stored and accessed, it's
> important enough to have a name.
>
> `std::tuple` primarily exists for metaprogramming reasons (building
> structs, etc). If you're using it in static code like the declaration
> above, you're almost always using the wrong tool.
>
> No, it's best to just leave things as they are. In those circumstances
>>> where it is necessary to achieve what you want, you can still do it. But
>>> the poor syntax and copying behavior will encourage you to avoid it
>>> whenever possible.
>>>
>>
>> An "it's best to leave things as they are" attitude would leave us with
>> c+98 and prevent c++ ever becoming a mature fully-featured expressive
>> language. I'm afraid to say that I cannot take this statement seriously.
>>
>
> I didn't say we should leave all of C++ as it is. I'm saying that we
> should leave *this* as it is.
>
> My problems with this really boil down to (in priority order):
>
> 1) It abuses structured binding, forcing it to do something that
> structured binding isn't meant to do simply because it is convenient syntax.
>
Tuples and structures are _logically_ two flavours of the same thing. We
happen to talk about them as if they are different for historic reasons,
not logical ones. For me, the ability to spontaneously create an object of
an arbitrary compound type, and inject the names of its members into local
scope seems useful. It is this feature that gives python (for example) its
wonderfully succinct list-comprehension syntax.
>
>
> 2) The problems this solves are not encountered frequently enough to
> override #1.
>
Assertion. New tools create new opportunities.
>
> 3) In a lot of the practical cases where this might be useful, there are
> better solutions that don't need it (like my range adaptor example).
>
Building a new iterator type for every logical scenario is inconvenient and
difficult to teach. It hides logic details. This is why range-based-for was
invented. "keep simple things simple".
>
> 4) It encourages writing ugly code. The more variables you shove into a
> `for` initializer, the more testing and incrementing expressions you need
> and the harder it is to follow the logic. This is a big part of why the
> range adaptor is preferred where possible; it hides the ugly details.
>
> Remember: they could have made `auto` do this exact thing when we
>>>>> standardized it in 2011. But the committee expressly decided against it.
>>>>> All of the reasons for not allowing it then are still just as valid now.
>>>>>
>>>>
>>>> I am not privy to the reasons. Are you able to elaborate please? I
>>>> don't think structured bindings were on the table back in 2011.
>>>>
>>>
>>> I didn't say structured bindings. I said `auto`.
>>>
>>
>> Mea culpa.
>>
>>
>>>
>>> Remember: what you want* is not structured bindings*. Structured
>>> binding is about unpacking objects that store data into multiple
>>> variable-like constructs. You don't have such a object, and you don't
>>> really want one. The only reason you created a tuple of values was because
>>> structured binding *requires* it.
>>>
>>> What you really want is the ability to declare multiple variables of
>>> different types in a single declaration statement. When `auto` was being
>>> standardized, there was discussion about allowing precisely that:
>>>
>>> auto x = 5.0f, y = 10, z = std::string("foo");
>>>
>>> These would deduce 3 different types for the 3 variables. The committee
>>> specifically decided* against* doing this.
>>>
>>
>> Deciding against this seems to me to have been, in hindsight, the wrong
>> decision. Perhaps this error can be corrected in a future standard?
>>
>
> Well, changing it is possible. At present, [dcl.spec.auto]/7 says:
>
> > The type of each declared variable is determined by placeholder type
> deduction (10.1.7.4.1), and if the type that replaces the placeholder type
> is not the same in each deduction, the program is ill-formed.
>
> This means that every declaration which would deduce different types is at
> present illegal. So removing this restriction would not break any currently
> legal code.
>
> And this change would be a *lot* more palatable than (ab)using structured
> binding for this purpose. It would also have semantics that are more
> immediately obvious than those for (ab)using structured binding in this way.
>
> Though personally, I still think it's a bad idea.
>
Do you mind explaining why? Because to me it seems like a splendid idea. To
me, auto x = foo(), y = bar(); seems succinct and neat. Someone who didn't
know the language would read this and naturally conclude that x and y may
be of different types.
>
> I have yet to see a reasonable rationalisation (in the light of
>> since-gathered experience) of this decision.
>>
>
> It's you who have to come up with a rationalization *for* the change, not
> the other way around. If "the light of since-gathered experience" really is
> on your side, you ought to be able to look at all of the old arguments
> against it and answer them one-by-one based on that experience.
>
For one, it's more naturally logical to imagine that an auto variable will
have the type of its initialiser.
>
> Be sure to bring up the Range TS Iterator/Sentinel paradigm. That's
> *always* a slam-dunk when it comes to deducing the same type ;)
>
I'm not sure what you mean here. In any range-based algorithm you will
certainly want the ability for the iterator to be of a different type to
the sentinel. multi-typed auto would help this.
>
> The `auto` proposals for C++11 are all still available from the
> committee's website. Feel free to download them and start working through
> the counter-arguments.
>
> --
> 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/c8d3dd9a-69c7-4586-
> b0d3-cec9122c8b6a%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/c8d3dd9a-69c7-4586-b0d3-cec9122c8b6a%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CALvx3hbqenGQuE14yXsQqGRBuKRHY99fwH96JEkFAPTd5jo8QA%40mail.gmail.com.
--001a113f27aa794c9a056047d1a4
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I won't dwell too much, just a couple of comments:<br>=
<br><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">On 14 Dec=
ember 2017 at 00:48, Nicol Bolas <span dir=3D"ltr"><<a href=3D"mailto:jm=
ckesson@gmail.com" target=3D"_blank">jmckesson@gmail.com</a>></span> wro=
te:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-=
left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><span class=3D"">On =
Wednesday, December 13, 2017 at 5:22:11 PM UTC-5, Richard Hodges wrote:</sp=
an><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">inline....<br><=
div><div><br><div class=3D"gmail_quote"><span class=3D"">On 13 December 201=
7 at 18:05, Nicol Bolas <span dir=3D"ltr"><<a rel=3D"nofollow"><u><font =
color=3D"#0066cc">jmck...@gmail.com</font></u></a>></span> wrote:<br></s=
pan><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-lef=
t:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><span class=3D""><span>=
On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges wrote:=
</span></span><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">answ=
er inline<div><div><div><div class=3D"gmail_quote"><div><br></div><blockquo=
te class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc so=
lid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><span class=3D""><blo=
ckquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-le=
ft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>It seems to me th=
at a small, non-breaking syntax change could allow this:</div></div></block=
quote><div><br></div><div>Structured
binding should not be used as a quick-and-dirty way to create multiple=20
variables of different types in a place where that wasn't possible=20
previously. And we <i>certainly</i> should not add syntax to encourage this=
..</div></span></div></blockquote><span class=3D""><div><br></div><div>This
is sounding like unsubstansiated opinion. And I respectfully disagree -
it seems useful to me to be able to create a tuple with named arguments
in a local slope on the fly.<br></div></span></div></div></div></div></div=
></blockquote><span class=3D""><div><br></div><div>And you can do that alre=
ady. What we shouldn't do is<i> encourage</i> it or hide the fact that =
this is what you're doing.</div><div><br></div><div>Here's the thin=
g. The only time you absolutely<i> need</i>
this feature is when you're declaring variables in a place where you=
=20
only get one declaration. Because if you can make multiple declarations,
there's nothing stopping you from doing:</div><div><br></div><div styl=
e=3D"border:1px solid rgb(187,187,187);word-wrap:break-word;background-colo=
r:rgb(250,250,250)"><code><div><span style=3D"color:#008">auto</span><span =
style=3D"color:#000"> i </span><span style=3D"color:#660">=3D</span><span s=
tyle=3D"color:#000"> size_t</span><span style=3D"color:#660">(</span><span =
style=3D"color:#066">0</span><span style=3D"color:#660">);</span><span styl=
e=3D"color:#000"><br></span><span style=3D"color:#008">auto</span><span sty=
le=3D"color:#000"> first </span><span style=3D"color:#660">=3D</span><span =
style=3D"color:#000"> </span><span style=3D"color:#008">begin</span><span s=
tyle=3D"color:#660">(</span><span style=3D"color:#000">v</span><span style=
=3D"color:#660">);</span><span style=3D"color:#000"><br></span><span style=
=3D"color:#008">auto</span><span style=3D"color:#000"> </span><span style=
=3D"color:#008">last</span><span style=3D"color:#000"> </span><span style=
=3D"color:#660">=3D</span><span style=3D"color:#000"> </span><span style=3D=
"color:#008">end</span><span style=3D"color:#660">(</span><span style=3D"co=
lor:#000">v</span><span style=3D"color:#660">);</span></div></code></div><d=
iv><br></div><div>I
find these lines to be far more readable than the structured binding=20
version or your alternative structured binding syntax. So the only time=20
people should use your alternate syntax is when they're only allowed a=
=20
single declaration. And that means in the initializer section of some=20
statement.</div><div><br></div></span></div></blockquote><span class=3D""><=
div><br></div><div>In
current c++, in order to declare these variables one per line while=20
enclosing them strictly within the scope of the algorithm, once would=20
need to enclose the entire algorithm in a pair of logically=20
un-neccessary curly braces.</div></span></div></div></div></div></blockquot=
e><div><br></div><div>...
huh? If you have some variables that are "strictly within the scope o=
f=20
the algorithm", then that algorithm must already have <i>scope</i>. So=
=20
where would these "logically un-neccessary curly braces" need to =
come=20
from? Unless "scope of the algorithm" should somehow not involve =
a C++ scope.</div><div><br></div><div>And
if the algorithm's scope isn't bounded by C++ scope, what does it=
=20
matter if its one variable or 20; none of these variables are strictly=20
within the scope of the algorithm. They are within the C++ scope, which=20
we've just stated isn't the algorithm's scope.<br></div><span c=
lass=3D""><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:=
0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex=
"><div dir=3D"ltr"><div>Do
we really need to add special syntax for something that only gets used=20
in such limited scenarios? Even worse, if we add such syntax, aren't we=
=20
encouraging people to declare a bunch of variables in one line, which is
generally considered bad form?</div></div></blockquote><div><br></div><div=
>It
seems to me that tuples have become a special kind of problem, in that=20
there is core language support for half of the construct, but=20
library-only support for the rest.</div></div></div></div></div></blockquot=
e><div><br></div></span><div>There is no core language support for any part=
of `tuple`. What we have is core language support for <i>decomposition</i>=
, and `std::tuple` is a decomposable type. But any user-created type can be=
decomposable with the right definition or machinery.</div><div><br></div><=
div>Don't think of structured binding as a thing that works on tuples, =
with tuples, or is about tuples.<br></div><span class=3D""><div><br></div><=
blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border=
-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div><div clas=
s=3D"gmail_quote"><div>Similarly initializer_list and typeinfo. I am of the=
view that this is an aberration.</div></div></div></div></div></blockquote=
><div><br></div></span><div>I
don't even know what you're talking about with these. `type_info` =
is a=20
C++ object returned by `typeid`, which allows basic queries about types=20
to work without creating some new C++ construct that you have to define a
bunch of rules for. `initializer_list` is much the same.<br></div><span cl=
ass=3D""><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin=
:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><div><div class=3D"gmail_quote"><div>Either support it in the=
core language or don't. The current half and half approach is an error=
.. why shouldn't I be able to say:</div><div><br></div><div><span style=
=3D"font-family:monospace,monospace">auto t =3D auto [x =3D int(1), y =3D s=
td::string("foo"), 6];=C2=A0 // get<0>(t) =3D=3D 1, get<=
1>(t) =3D=3D "foo", get<2>(t) =3D=3D 6<br></span></div><=
div>=C2=A0 <br></div><div>such
an expression is expressive, succinct and useful. I can manipulate the=20
tuple either as a complete object or as individual objects. Great!</div></d=
iv></div></div></div></blockquote><div><br></div></span><div>I fail to see =
how that is an improvement over using a tuple. And quite frankly, we alread=
y have ways of declaring a type:</div><div><br></div><div class=3D"m_-84874=
99323186273382prettyprint" style=3D"background-color:rgb(250,250,250);borde=
r-color:rgb(187,187,187);border-style:solid;border-width:1px"><code class=
=3D"m_-8487499323186273382prettyprint"><div class=3D"m_-8487499323186273382=
subprettyprint"><span class=3D"m_-8487499323186273382styled-by-prettify" st=
yle=3D"color:#008">struct</span><span class=3D"m_-8487499323186273382styled=
-by-prettify" style=3D"color:#000"> </span><span class=3D"m_-84874993231862=
73382styled-by-prettify" style=3D"color:#660">{</span><span class=3D"m_-848=
7499323186273382styled-by-prettify" style=3D"color:#008">int</span><span cl=
ass=3D"m_-8487499323186273382styled-by-prettify" style=3D"color:#000"> x </=
span><span class=3D"m_-8487499323186273382styled-by-prettify" style=3D"colo=
r:#660">=3D</span><span class=3D"m_-8487499323186273382styled-by-prettify" =
style=3D"color:#000"> </span><span class=3D"m_-8487499323186273382styled-by=
-prettify" style=3D"color:#066">1</span><span class=3D"m_-84874993231862733=
82styled-by-prettify" style=3D"color:#660">;</span><span class=3D"m_-848749=
9323186273382styled-by-prettify" style=3D"color:#000"> std</span><span clas=
s=3D"m_-8487499323186273382styled-by-prettify" style=3D"color:#660">::</spa=
n><span class=3D"m_-8487499323186273382styled-by-prettify" style=3D"color:#=
008">string</span><span class=3D"m_-8487499323186273382styled-by-prettify" =
style=3D"color:#000"> y</span><span class=3D"m_-8487499323186273382styled-b=
y-prettify" style=3D"color:#660">{</span><span class=3D"m_-8487499323186273=
382styled-by-prettify" style=3D"color:#080">"foo"</span><span cla=
ss=3D"m_-8487499323186273382styled-by-prettify" style=3D"color:#660">};</sp=
an><span class=3D"m_-8487499323186273382styled-by-prettify" style=3D"color:=
#000"> </span><span class=3D"m_-8487499323186273382styled-by-prettify" styl=
e=3D"color:#008">int</span><span class=3D"m_-8487499323186273382styled-by-p=
rettify" style=3D"color:#000"> z </span><span class=3D"m_-84874993231862733=
82styled-by-prettify" style=3D"color:#660">=3D</span><span class=3D"m_-8487=
499323186273382styled-by-prettify" style=3D"color:#000"> </span><span class=
=3D"m_-8487499323186273382styled-by-prettify" style=3D"color:#066">6</span>=
<span class=3D"m_-8487499323186273382styled-by-prettify" style=3D"color:#66=
0">;}</span><span class=3D"m_-8487499323186273382styled-by-prettify" style=
=3D"color:#000"> t</span><span class=3D"m_-8487499323186273382styled-by-pre=
ttify" style=3D"color:#660">;</span></div></code></div><div><br></div></div=
></blockquote><div><br></div><div>Declaring an object of on-the-fly struct =
would be a solution if a struct's members could be declared auto. Unhap=
pily they cannot, so this solution would only work where types are well kno=
wn. Of course the argument for introducing auto hinged on convenience of ty=
pe deduction, particularly in template expansions. This is a convenience I =
think we all enjoy. I would like to see this kind of convenience extended.<=
/div><div><br></div><div>As a side note, there is exactly one core language=
feature in which the types of members is automatically deduced - the lambd=
a with capture. The automatic deduction is useful in this case, it might we=
ll be in others.<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote=
" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><=
div dir=3D"ltr"><div>Oh sure, you can't leave a member unnamed, but why=
would you<i> want to</i>? If that member is important enough to be stored =
and accessed, it's important enough to have a name.</div><div><br></div=
><div>`std::tuple` primarily exists for metaprogramming reasons (building s=
tructs, etc). If you're using it in static code like the declaration ab=
ove, you're almost always using the wrong tool.<br></div><span class=3D=
""><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"ltr">=
<div><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" styl=
e=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div di=
r=3D"ltr"><div>No,
it's best to just leave things as they are. In those circumstances=20
where it is necessary to achieve what you want, you can still do it. But
the poor syntax and copying behavior will encourage you to avoid it=20
whenever possible.</div></div></blockquote><div><br></div><div>An "it&=
#39;s=20
best to leave things as they are" attitude would leave us with c+98 an=
d=20
prevent c++ ever becoming a mature fully-featured expressive language.=20
I'm afraid to say that I cannot take this statement seriously.<br></div=
></div></div></div></div></blockquote><div><br></div></span><div>I didn'=
;t say we should leave all of C++ as it is. I'm saying that we should l=
eave <i>this</i> as it is.</div><div><br></div><div>My problems with this r=
eally boil down to (in priority order):</div><div><br></div><div>1) It abus=
es structured binding, forcing it to do something that structured binding i=
sn't meant to do simply because it is convenient syntax.</div></div></b=
lockquote><div><br></div>Tuples and structures are _logically_ two flavours=
of the same thing. We happen to talk about them as if they are different f=
or historic reasons, not logical ones. For me, the ability to spontaneously=
create an object of an arbitrary compound type, and inject the names of it=
s members into local scope seems useful. It is this feature that gives pyth=
on (for example) its wonderfully succinct list-comprehension syntax.<br></d=
iv><div class=3D"gmail_quote">=C2=A0<blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div>2) The problems this solves are not encountere=
d frequently enough to override #1.</div></div></blockquote><div><br></div>=
<div>Assertion. New tools create new opportunities.<br></div><div>=C2=A0</d=
iv><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left=
:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>3) I=
n a lot of the practical cases where this might be useful, there are better=
solutions that don't need it (like my range adaptor example).</div></d=
iv></blockquote><div><br></div><div>Building a new iterator type for every =
logical scenario is inconvenient and difficult to teach. It hides logic det=
ails. This is why range-based-for was invented. "keep simple things si=
mple".<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div d=
ir=3D"ltr"><div><br></div><div>4) It encourages writing ugly code. The more=
variables you shove into a `for` initializer, the more testing and increme=
nting expressions you need and the harder it is to follow the logic. This i=
s a big part of why the range adaptor is preferred where possible; it hides=
the ugly details.<br></div><span class=3D""><div><br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc=
solid;padding-left:1ex"><div dir=3D"ltr"><div><div><div class=3D"gmail_quo=
te"><div></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex=
;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><span><block=
quote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left=
:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div class=3D"gmail=
_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border=
-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Remember:
they could have made `auto` do this exact thing when we standardized it
in 2011. But the committee expressly decided against it. All of the=20
reasons for not allowing it then are still just as valid now.<br></div></di=
v></blockquote><div><br></div><div>I
am not privy to the reasons. Are you able to elaborate please? I don't=
=20
think structured bindings were on the table back in 2011.<br></div></div></=
div></div></blockquote><div><br></div></span><div>I didn't say structur=
ed bindings. I said `auto`.</div></div></blockquote><div><br></div><div>Mea=
culpa.<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div>Remember: what you want<i> is not structured b=
indings</i>.
Structured binding is about unpacking objects that store data into=20
multiple variable-like constructs. You don't have such a object, and yo=
u
don't really want one. The only reason you created a tuple of values=
=20
was because structured binding <i>requires</i> it.</div><div><br></div><div=
>What
you really want is the ability to declare multiple variables of=20
different types in a single declaration statement. When `auto` was being
standardized, there was discussion about allowing precisely that:</div><di=
v><br></div><div style=3D"border:1px solid rgb(187,187,187);word-wrap:break=
-word;background-color:rgb(250,250,250)"><code><div><span style=3D"color:#0=
08">auto</span><span style=3D"color:#000"> x </span><span style=3D"color:#6=
60">=3D</span><span style=3D"color:#000"> </span><span style=3D"color:#066"=
>5.0f</span><span style=3D"color:#660">,</span><span style=3D"color:#000"> =
y </span><span style=3D"color:#660">=3D</span><span style=3D"color:#000"> <=
/span><span style=3D"color:#066">10</span><span style=3D"color:#660">,</spa=
n><span style=3D"color:#000"> z </span><span style=3D"color:#660">=3D</span=
><span style=3D"color:#000"> std</span><span style=3D"color:#660">::</span>=
<span style=3D"color:#008">string</span><span style=3D"color:#660">(</span>=
<span style=3D"color:#080">"foo"</span><span style=3D"color:#660"=
>);</span><span style=3D"color:#000"><br></span></div></code></div><br><div=
>These would deduce 3 different types for the 3 variables. The committee sp=
ecifically decided<i> against</i> doing this.</div></div></blockquote><div>=
<br></div><div>Deciding
against this seems to me to have been, in hindsight, the wrong=20
decision. Perhaps this error can be corrected in a future standard?</div></=
div></div></div></div></blockquote><div><br></div></span><div>Well, changin=
g it is possible. At present, [dcl.spec.auto]/7 says:</div><div><br></div><=
div>>
The type of each declared variable is determined by placeholder type=20
deduction (10.1.7.4.1), and if the type that replaces the placeholder=20
type is not the same in each deduction, the program is ill-formed.</div><di=
v><br></div><div>This
means that every declaration which would deduce different types is at=20
present illegal. So removing this restriction would not break any=20
currently legal code.</div><div><br></div><div>And this change would be a <=
i>lot</i>
more palatable than (ab)using structured binding for this purpose. It=20
would also have semantics that are more immediately obvious than those=20
for (ab)using structured binding in this way.<br></div><div><br></div><div>=
Though personally, I still think it's a bad idea.<br></div></div></bloc=
kquote><div><br></div><div>Do you mind explaining why? Because to me it see=
ms like a splendid idea. To me, <span style=3D"font-family:monospace,monosp=
ace">auto x =3D foo(), y =3D bar();</span> seems succinct and neat. Someone=
who didn't know the language would read this and naturally conclude th=
at x and y may be of different types.<br></div><blockquote class=3D"gmail_q=
uote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1e=
x"><div dir=3D"ltr"><div></div><span class=3D""><div><br></div><blockquote =
class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #=
ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div><div class=3D"gmail_=
quote"><div>I have yet to see a reasonable rationalisation (in the light of=
since-gathered experience) of this decision.<br></div></div></div></div></=
div></blockquote><div><br></div></span><div>It's you who have to come u=
p with a rationalization <i>for</i>
the change, not the other way around. If "the light of since-gathered=
=20
experience" really is on your side, you ought to be able to look at al=
l=20
of the old arguments against it and answer them one-by-one based on that
experience.</div></div></blockquote><div><br></div><div>For one, it's =
more naturally logical to imagine that an auto variable will have the type =
of its initialiser.=C2=A0 <br></div><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div>Be sure to bring up the Range TS Iterator/Sent=
inel paradigm. That's <i>always</i> a slam-dunk when it comes to deduci=
ng the same type ;)<br></div></div></blockquote><div><br></div><div><br></d=
iv><div>I'm not sure what you mean here. In any range-based algorithm y=
ou will certainly want the ability for the iterator to be of a different ty=
pe to the sentinel. multi-typed auto would help this.<br></div><div>=C2=A0<=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-le=
ft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div><br></=
div><div>The
`auto` proposals for C++11 are all still available from the committee'=
s
website. Feel free to download them and start working through the=20
counter-arguments.<br></div><div><br></div><blockquote class=3D"gmail_quote=
" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-le=
ft:1ex">
</blockquote></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/c8d3dd9a-69c7-4586-b0d3-cec9122c8b6a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/c8d3=
dd9a-69c7-4586-<wbr>b0d3-cec9122c8b6a%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CALvx3hbqenGQuE14yXsQqGRBuKRHY99fwH96=
JEkFAPTd5jo8QA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hbqenGQuE14=
yXsQqGRBuKRHY99fwH96JEkFAPTd5jo8QA%40mail.gmail.com</a>.<br />
--001a113f27aa794c9a056047d1a4--
.
Author: Richard Hodges <hodges.r@gmail.com>
Date: Thu, 14 Dec 2017 13:37:19 +0100
Raw View
--001a113f64761f937805604c25be
Content-Type: text/plain; charset="UTF-8"
Having pondered the responses, it turns out that I can express my algorithm
in a tightly scoped, DRY and legal manner in current c++ like this:
// imagine there is an f(auto&& elem, auto&& index)
using std::begin, std::end;
[&f, i = std::size_t(0), first = begin(v), last = end(v)]() mutable
{
while(first != last)
f(*first++, i++);
}();
This is of course a horrid abuse of lambdas and is certainly the kind of
code that should be discouraged - except that it's actually doing what I
want - which is allowing me to create more than one loop-scoped variable in
a template-friendly manner.
Of course, I could write a function for this, but in reality what I am
doing here is a 2-liner. It doesn't warrant figuring out a reasonable
function name, documenting the function and deciding which header file
it'll live in (forever).
Horrid as it is, what it shows is that we are already familiar with the
syntax of enumerating variable creation and allowing the compiler to
generate a class (tuple) for us.
I really do think that there is a case for allowing:
for(auto [i = std::size_t(0)] ; auto&& elem : v)
f(elem, i++);
or:
for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ; first !=
last ; ++first, ++i)
f(*first, i);
or:
for(auto i = std::size_t(0), first = begin(v), last = end(v) ; first !=
last ; ++first, ++i)
f(*first, i);
since we already have this ability in the nasty lambda above, why not
provide the ability in a way that's easy to reason about?
On 14 December 2017 at 08:27, Richard Hodges <hodges.r@gmail.com> wrote:
> I won't dwell too much, just a couple of comments:
>
>
>
> On 14 December 2017 at 00:48, Nicol Bolas <jmckesson@gmail.com> wrote:
>
>> On Wednesday, December 13, 2017 at 5:22:11 PM UTC-5, Richard Hodges wrote:
>>>
>>> inline....
>>>
>>> On 13 December 2017 at 18:05, Nicol Bolas <*jmck...@gmail.com*> wrote:
>>>
>>>> On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges
>>>> wrote:
>>>>>
>>>>> answer inline
>>>>>
>>>>>
>>>>>> It seems to me that a small, non-breaking syntax change could allow
>>>>>>> this:
>>>>>>>
>>>>>>
>>>>>> Structured binding should not be used as a quick-and-dirty way to
>>>>>> create multiple variables of different types in a place where that wasn't
>>>>>> possible previously. And we *certainly* should not add syntax to
>>>>>> encourage this.
>>>>>>
>>>>>
>>>>> This is sounding like unsubstansiated opinion. And I respectfully
>>>>> disagree - it seems useful to me to be able to create a tuple with named
>>>>> arguments in a local slope on the fly.
>>>>>
>>>>
>>>> And you can do that already. What we shouldn't do is* encourage* it or
>>>> hide the fact that this is what you're doing.
>>>>
>>>> Here's the thing. The only time you absolutely* need* this feature is
>>>> when you're declaring variables in a place where you only get one
>>>> declaration. Because if you can make multiple declarations, there's nothing
>>>> stopping you from doing:
>>>>
>>>> auto i = size_t(0);
>>>> auto first = begin(v);
>>>> auto last = end(v);
>>>>
>>>> I find these lines to be far more readable than the structured binding
>>>> version or your alternative structured binding syntax. So the only time
>>>> people should use your alternate syntax is when they're only allowed a
>>>> single declaration. And that means in the initializer section of some
>>>> statement.
>>>>
>>>>
>>> In current c++, in order to declare these variables one per line while
>>> enclosing them strictly within the scope of the algorithm, once would need
>>> to enclose the entire algorithm in a pair of logically un-neccessary curly
>>> braces.
>>>
>>
>> ... huh? If you have some variables that are "strictly within the scope
>> of the algorithm", then that algorithm must already have *scope*. So
>> where would these "logically un-neccessary curly braces" need to come from?
>> Unless "scope of the algorithm" should somehow not involve a C++ scope.
>>
>> And if the algorithm's scope isn't bounded by C++ scope, what does it
>> matter if its one variable or 20; none of these variables are strictly
>> within the scope of the algorithm. They are within the C++ scope, which
>> we've just stated isn't the algorithm's scope.
>>
>> Do we really need to add special syntax for something that only gets used
>>>> in such limited scenarios? Even worse, if we add such syntax, aren't we
>>>> encouraging people to declare a bunch of variables in one line, which is
>>>> generally considered bad form?
>>>>
>>>
>>> It seems to me that tuples have become a special kind of problem, in
>>> that there is core language support for half of the construct, but
>>> library-only support for the rest.
>>>
>>
>> There is no core language support for any part of `tuple`. What we have
>> is core language support for *decomposition*, and `std::tuple` is a
>> decomposable type. But any user-created type can be decomposable with the
>> right definition or machinery.
>>
>> Don't think of structured binding as a thing that works on tuples, with
>> tuples, or is about tuples.
>>
>> Similarly initializer_list and typeinfo. I am of the view that this is an
>>> aberration.
>>>
>>
>> I don't even know what you're talking about with these. `type_info` is a
>> C++ object returned by `typeid`, which allows basic queries about types to
>> work without creating some new C++ construct that you have to define a
>> bunch of rules for. `initializer_list` is much the same.
>>
>>
>>> Either support it in the core language or don't. The current half and
>>> half approach is an error. why shouldn't I be able to say:
>>>
>>> auto t = auto [x = int(1), y = std::string("foo"), 6]; // get<0>(t) ==
>>> 1, get<1>(t) == "foo", get<2>(t) == 6
>>>
>>> such an expression is expressive, succinct and useful. I can manipulate
>>> the tuple either as a complete object or as individual objects. Great!
>>>
>>
>> I fail to see how that is an improvement over using a tuple. And quite
>> frankly, we already have ways of declaring a type:
>>
>> struct {int x = 1; std::string y{"foo"}; int z = 6;} t;
>>
>>
> Declaring an object of on-the-fly struct would be a solution if a struct's
> members could be declared auto. Unhappily they cannot, so this solution
> would only work where types are well known. Of course the argument for
> introducing auto hinged on convenience of type deduction, particularly in
> template expansions. This is a convenience I think we all enjoy. I would
> like to see this kind of convenience extended.
>
> As a side note, there is exactly one core language feature in which the
> types of members is automatically deduced - the lambda with capture. The
> automatic deduction is useful in this case, it might well be in others.
>
>
>> Oh sure, you can't leave a member unnamed, but why would you* want to*?
>> If that member is important enough to be stored and accessed, it's
>> important enough to have a name.
>>
>> `std::tuple` primarily exists for metaprogramming reasons (building
>> structs, etc). If you're using it in static code like the declaration
>> above, you're almost always using the wrong tool.
>>
>> No, it's best to just leave things as they are. In those circumstances
>>>> where it is necessary to achieve what you want, you can still do it. But
>>>> the poor syntax and copying behavior will encourage you to avoid it
>>>> whenever possible.
>>>>
>>>
>>> An "it's best to leave things as they are" attitude would leave us with
>>> c+98 and prevent c++ ever becoming a mature fully-featured expressive
>>> language. I'm afraid to say that I cannot take this statement seriously.
>>>
>>
>> I didn't say we should leave all of C++ as it is. I'm saying that we
>> should leave *this* as it is.
>>
>> My problems with this really boil down to (in priority order):
>>
>> 1) It abuses structured binding, forcing it to do something that
>> structured binding isn't meant to do simply because it is convenient syntax.
>>
>
> Tuples and structures are _logically_ two flavours of the same thing. We
> happen to talk about them as if they are different for historic reasons,
> not logical ones. For me, the ability to spontaneously create an object of
> an arbitrary compound type, and inject the names of its members into local
> scope seems useful. It is this feature that gives python (for example) its
> wonderfully succinct list-comprehension syntax.
>
>>
>>
>> 2) The problems this solves are not encountered frequently enough to
>> override #1.
>>
>
> Assertion. New tools create new opportunities.
>
>
>>
>> 3) In a lot of the practical cases where this might be useful, there are
>> better solutions that don't need it (like my range adaptor example).
>>
>
> Building a new iterator type for every logical scenario is inconvenient
> and difficult to teach. It hides logic details. This is why range-based-for
> was invented. "keep simple things simple".
>
>
>>
>> 4) It encourages writing ugly code. The more variables you shove into a
>> `for` initializer, the more testing and incrementing expressions you need
>> and the harder it is to follow the logic. This is a big part of why the
>> range adaptor is preferred where possible; it hides the ugly details.
>>
>> Remember: they could have made `auto` do this exact thing when we
>>>>>> standardized it in 2011. But the committee expressly decided against it.
>>>>>> All of the reasons for not allowing it then are still just as valid now.
>>>>>>
>>>>>
>>>>> I am not privy to the reasons. Are you able to elaborate please? I
>>>>> don't think structured bindings were on the table back in 2011.
>>>>>
>>>>
>>>> I didn't say structured bindings. I said `auto`.
>>>>
>>>
>>> Mea culpa.
>>>
>>>
>>>>
>>>> Remember: what you want* is not structured bindings*. Structured
>>>> binding is about unpacking objects that store data into multiple
>>>> variable-like constructs. You don't have such a object, and you don't
>>>> really want one. The only reason you created a tuple of values was because
>>>> structured binding *requires* it.
>>>>
>>>> What you really want is the ability to declare multiple variables of
>>>> different types in a single declaration statement. When `auto` was being
>>>> standardized, there was discussion about allowing precisely that:
>>>>
>>>> auto x = 5.0f, y = 10, z = std::string("foo");
>>>>
>>>> These would deduce 3 different types for the 3 variables. The committee
>>>> specifically decided* against* doing this.
>>>>
>>>
>>> Deciding against this seems to me to have been, in hindsight, the wrong
>>> decision. Perhaps this error can be corrected in a future standard?
>>>
>>
>> Well, changing it is possible. At present, [dcl.spec.auto]/7 says:
>>
>> > The type of each declared variable is determined by placeholder type
>> deduction (10.1.7.4.1), and if the type that replaces the placeholder type
>> is not the same in each deduction, the program is ill-formed.
>>
>> This means that every declaration which would deduce different types is
>> at present illegal. So removing this restriction would not break any
>> currently legal code.
>>
>> And this change would be a *lot* more palatable than (ab)using
>> structured binding for this purpose. It would also have semantics that are
>> more immediately obvious than those for (ab)using structured binding in
>> this way.
>>
>> Though personally, I still think it's a bad idea.
>>
>
> Do you mind explaining why? Because to me it seems like a splendid idea.
> To me, auto x = foo(), y = bar(); seems succinct and neat. Someone who
> didn't know the language would read this and naturally conclude that x and
> y may be of different types.
>
>>
>> I have yet to see a reasonable rationalisation (in the light of
>>> since-gathered experience) of this decision.
>>>
>>
>> It's you who have to come up with a rationalization *for* the change,
>> not the other way around. If "the light of since-gathered experience"
>> really is on your side, you ought to be able to look at all of the old
>> arguments against it and answer them one-by-one based on that experience.
>>
>
> For one, it's more naturally logical to imagine that an auto variable will
> have the type of its initialiser.
>
>>
>> Be sure to bring up the Range TS Iterator/Sentinel paradigm. That's
>> *always* a slam-dunk when it comes to deducing the same type ;)
>>
>
>
> I'm not sure what you mean here. In any range-based algorithm you will
> certainly want the ability for the iterator to be of a different type to
> the sentinel. multi-typed auto would help this.
>
>
>>
>> The `auto` proposals for C++11 are all still available from the
>> committee's website. Feel free to download them and start working through
>> the counter-arguments.
>>
>> --
>> 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/is
>> ocpp.org/d/msgid/std-proposals/c8d3dd9a-69c7-4586-b0d3-
>> cec9122c8b6a%40isocpp.org
>> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/c8d3dd9a-69c7-4586-b0d3-cec9122c8b6a%40isocpp.org?utm_medium=email&utm_source=footer>
>> .
>>
>
>
--
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/CALvx3hYqju17KotXw9cB1kvsvR4EJ2K0-r_LO-rnDnTsLVJr%3Dg%40mail.gmail.com.
--001a113f64761f937805604c25be
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Having pondered the responses, it turns out that I can exp=
ress my algorithm in a tightly scoped, DRY and legal manner in current c++ =
like this:<div><br></div><div>=C2=A0 =C2=A0 =C2=A0=C2=A0<br><div><span styl=
e=3D"color:rgb(0,0,255);font-family:monospace,monospace;background-color:rg=
b(255,255,254);font-size:14px;white-space:pre"> // imagine there is an f=
(auto&& elem, auto&& index)</span><br></div><div><div style=
=3D"background-color:rgb(255,255,254);font-size:14px;line-height:21px;white=
-space:pre"><div style=3D"color:rgb(0,0,0);line-height:21px"><div><font fac=
e=3D"monospace, monospace"><span style=3D"color:rgb(0,0,255)"><br></span></=
font></div><div><font face=3D"monospace, monospace"><span style=3D"color:rg=
b(0,0,255)"> using</span> std::begin, std::end;</font></div></div><div s=
tyle=3D"color:rgb(0,0,0)"><font face=3D"monospace, monospace"> [&f, =
i =3D std::size_t(<span style=3D"color:rgb(9,136,90)">0</span>), first =3D =
begin(v), last =3D end(v)]() <span style=3D"color:rgb(0,0,255)">mutable</sp=
an></font></div><div style=3D"color:rgb(0,0,0)"><font face=3D"monospace, mo=
nospace"> { </font></div><div><font face=3D"monospace, monospace"><font =
color=3D"#000000"> </font><span style=3D"color:rgb(0,0,255)">while</=
span><font color=3D"#000000">(</font></font><span style=3D"color:rgb(0,0,0)=
;font-family:monospace,monospace">first !=3D last</span><font face=3D"monos=
pace, monospace"><font color=3D"#000000">)</font></font></div><div style=3D=
"color:rgb(0,0,0)"><font face=3D"monospace, monospace"> f(*first=
++, </font><span style=3D"font-family:monospace,monospace">i++)</span><span=
style=3D"font-family:monospace,monospace">;</span></div><div style=3D"colo=
r:rgb(0,0,0)"><font face=3D"monospace, monospace"> }();</font></div><div=
style=3D"color:rgb(0,0,0);font-family:"Fira Mono""><br></div></d=
iv></div><div>This is of course a horrid abuse of lambdas and is certainly =
the kind of code that should be discouraged - except that it's actually=
doing what I want - which is allowing me to create more than one loop-scop=
ed variable in a template-friendly manner.</div><div>Of course, I could wri=
te a function for this, but in reality what I am doing here is a 2-liner. I=
t doesn't warrant figuring out a reasonable function name, documenting =
the function and deciding which header file it'll live in (forever).</d=
iv><div><br></div><div>Horrid as it is, what it shows is that we are alread=
y familiar with the syntax of enumerating variable creation and allowing th=
e compiler to generate a class (tuple) for us.</div><div><br></div><div>I r=
eally do think that there is a case for allowing:</div><div><br></div><div>=
<div style=3D"color:rgb(0,0,0);font-size:14px;white-space:pre"><font face=
=3D"monospace, monospace"> for(auto [i =3D std::size_t(<span style=3D"co=
lor:rgb(9,136,90)">0</span>)] ; auto&& elem : v)</font></div><div s=
tyle=3D"color:rgb(0,0,0);font-size:14px;white-space:pre"><div><font face=3D=
"monospace, monospace"> f(elem, </font><span style=3D"font-famil=
y:monospace,monospace">i++)</span><span style=3D"font-family:monospace,mono=
space">;</span></div><div><span style=3D"font-family:monospace,monospace"><=
br></span></div></div></div><div><div>or:</div><div style=3D"color:rgb(0,0,=
0);font-size:14px;white-space:pre"><font face=3D"monospace, monospace"><br>=
</font></div><div style=3D"color:rgb(0,0,0);font-size:14px;white-space:pre"=
><font face=3D"monospace, monospace"> for(auto [i =3D std::size_t(<span =
style=3D"color:rgb(9,136,90)">0</span>), first =3D begin(v), last =3D end(v=
)] ; first !=3D last ; ++first, ++i)</font></div><div style=3D"color:rgb(0,=
0,0);font-size:14px;white-space:pre"><div><font face=3D"monospace, monospac=
e"> f(*first, </font><span style=3D"font-family:monospace,monosp=
ace">i)</span><span style=3D"font-family:monospace,monospace">;</span></div=
><div><span style=3D"font-family:monospace,monospace"><br></span></div></di=
v></div><div><div><div>or:</div><div style=3D"color:rgb(0,0,0);font-size:14=
px;white-space:pre"><font face=3D"monospace, monospace"><br></font></div><d=
iv style=3D"color:rgb(0,0,0);font-size:14px;white-space:pre"><font face=3D"=
monospace, monospace"> for(auto i =3D std::size_t(<span style=3D"color:r=
gb(9,136,90)">0</span>), first =3D begin(v), last =3D end(v) ; first !=3D l=
ast ; ++first, ++i)</font></div><div style=3D"color:rgb(0,0,0);font-size:14=
px;white-space:pre"><div><font face=3D"monospace, monospace"> f(=
*first, </font><span style=3D"font-family:monospace,monospace">i)</span><sp=
an style=3D"font-family:monospace,monospace">;</span></div><div><span style=
=3D"font-family:monospace,monospace"><br></span></div></div></div></div><di=
v><div>since we already have this ability in the nasty lambda above, why no=
t provide the ability in a way that's easy to reason about?</div></div>=
<div><br></div><div><br></div><div><br></div></div></div><div class=3D"gmai=
l_extra"><br><div class=3D"gmail_quote">On 14 December 2017 at 08:27, Richa=
rd Hodges <span dir=3D"ltr"><<a href=3D"mailto:hodges.r@gmail.com" targe=
t=3D"_blank">hodges.r@gmail.com</a>></span> wrote:<br><blockquote class=
=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padd=
ing-left:1ex"><div dir=3D"ltr">I won't dwell too much, just a couple of=
comments:<br><br><br><div class=3D"gmail_extra"><br><div class=3D"gmail_qu=
ote"><div><div class=3D"h5">On 14 December 2017 at 00:48, Nicol Bolas <span=
dir=3D"ltr"><<a href=3D"mailto:jmckesson@gmail.com" target=3D"_blank">j=
mckesson@gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quot=
e" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">=
<div dir=3D"ltr"><span>On Wednesday, December 13, 2017 at 5:22:11 PM UTC-5,=
Richard Hodges wrote:</span><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">inline....<br><div><div><br><div class=3D"gmail_quote"><span>On =
13 December 2017 at 18:05, Nicol Bolas <span dir=3D"ltr"><<a rel=3D"nofo=
llow"><u><font color=3D"#0066cc">jmck...@gmail.com</font></u></a>></span=
> wrote:<br></span><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 =
..8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><span><s=
pan>On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges wr=
ote:</span></span><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"ltr">=
answer inline<div><div><div><div class=3D"gmail_quote"><div><br></div><bloc=
kquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #cc=
c solid;padding-left:1ex"><div dir=3D"ltr"><div><br></div><span><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>It seems to me that a sm=
all, non-breaking syntax change could allow this:</div></div></blockquote><=
div><br></div><div>Structured
binding should not be used as a quick-and-dirty way to create multiple=20
variables of different types in a place where that wasn't possible=20
previously. And we <i>certainly</i> should not add syntax to encourage this=
..</div></span></div></blockquote><span><div><br></div><div>This
is sounding like unsubstansiated opinion. And I respectfully disagree -
it seems useful to me to be able to create a tuple with named arguments
in a local slope on the fly.<br></div></span></div></div></div></div></div=
></blockquote><span><div><br></div><div>And you can do that already. What w=
e shouldn't do is<i> encourage</i> it or hide the fact that this is wha=
t you're doing.</div><div><br></div><div>Here's the thing. The only=
time you absolutely<i> need</i>
this feature is when you're declaring variables in a place where you=
=20
only get one declaration. Because if you can make multiple declarations,
there's nothing stopping you from doing:</div><div><br></div><div styl=
e=3D"border:1px solid rgb(187,187,187);word-wrap:break-word;background-colo=
r:rgb(250,250,250)"><code><div><span style=3D"color:#008">auto</span><span =
style=3D"color:#000"> i </span><span style=3D"color:#660">=3D</span><span s=
tyle=3D"color:#000"> size_t</span><span style=3D"color:#660">(</span><span =
style=3D"color:#066">0</span><span style=3D"color:#660">);</span><span styl=
e=3D"color:#000"><br></span><span style=3D"color:#008">auto</span><span sty=
le=3D"color:#000"> first </span><span style=3D"color:#660">=3D</span><span =
style=3D"color:#000"> </span><span style=3D"color:#008">begin</span><span s=
tyle=3D"color:#660">(</span><span style=3D"color:#000">v</span><span style=
=3D"color:#660">);</span><span style=3D"color:#000"><br></span><span style=
=3D"color:#008">auto</span><span style=3D"color:#000"> </span><span style=
=3D"color:#008">last</span><span style=3D"color:#000"> </span><span style=
=3D"color:#660">=3D</span><span style=3D"color:#000"> </span><span style=3D=
"color:#008">end</span><span style=3D"color:#660">(</span><span style=3D"co=
lor:#000">v</span><span style=3D"color:#660">);</span></div></code></div><d=
iv><br></div><div>I
find these lines to be far more readable than the structured binding=20
version or your alternative structured binding syntax. So the only time=20
people should use your alternate syntax is when they're only allowed a=
=20
single declaration. And that means in the initializer section of some=20
statement.</div><div><br></div></span></div></blockquote><span><div><br></d=
iv><div>In
current c++, in order to declare these variables one per line while=20
enclosing them strictly within the scope of the algorithm, once would=20
need to enclose the entire algorithm in a pair of logically=20
un-neccessary curly braces.</div></span></div></div></div></div></blockquot=
e><div><br></div><div>...
huh? If you have some variables that are "strictly within the scope o=
f=20
the algorithm", then that algorithm must already have <i>scope</i>. So=
=20
where would these "logically un-neccessary curly braces" need to =
come=20
from? Unless "scope of the algorithm" should somehow not involve =
a C++ scope.</div><div><br></div><div>And
if the algorithm's scope isn't bounded by C++ scope, what does it=
=20
matter if its one variable or 20; none of these variables are strictly=20
within the scope of the algorithm. They are within the C++ scope, which=20
we've just stated isn't the algorithm's scope.<br></div><span><=
div><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"><div=
><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D=
"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D=
"ltr"><div>Do
we really need to add special syntax for something that only gets used=20
in such limited scenarios? Even worse, if we add such syntax, aren't we=
=20
encouraging people to declare a bunch of variables in one line, which is
generally considered bad form?</div></div></blockquote><div><br></div><div=
>It
seems to me that tuples have become a special kind of problem, in that=20
there is core language support for half of the construct, but=20
library-only support for the rest.</div></div></div></div></div></blockquot=
e><div><br></div></span><div>There is no core language support for any part=
of `tuple`. What we have is core language support for <i>decomposition</i>=
, and `std::tuple` is a decomposable type. But any user-created type can be=
decomposable with the right definition or machinery.</div><div><br></div><=
div>Don't think of structured binding as a thing that works on tuples, =
with tuples, or is about tuples.<br></div><span><div><br></div><blockquote =
class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #=
ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div><div class=3D"gmail_=
quote"><div>Similarly initializer_list and typeinfo. I am of the view that =
this is an aberration.</div></div></div></div></div></blockquote><div><br><=
/div></span><div>I
don't even know what you're talking about with these. `type_info` =
is a=20
C++ object returned by `typeid`, which allows basic queries about types=20
to work without creating some new C++ construct that you have to define a
bunch of rules for. `initializer_list` is much the same.<br></div><span><d=
iv>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-l=
eft:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><di=
v><div><div class=3D"gmail_quote"><div>Either support it in the core langua=
ge or don't. The current half and half approach is an error. why should=
n't I be able to say:</div><div><br></div><div><span style=3D"font-fami=
ly:monospace,monospace">auto t =3D auto [x =3D int(1), y =3D std::string(&q=
uot;foo"), 6];=C2=A0 // get<0>(t) =3D=3D 1, get<1>(t) =3D=
=3D "foo", get<2>(t) =3D=3D 6<br></span></div><div>=C2=A0 <=
br></div><div>such
an expression is expressive, succinct and useful. I can manipulate the=20
tuple either as a complete object or as individual objects. Great!</div></d=
iv></div></div></div></blockquote><div><br></div></span><div>I fail to see =
how that is an improvement over using a tuple. And quite frankly, we alread=
y have ways of declaring a type:</div><div><br></div><div class=3D"m_-14434=
53422475211204m_-8487499323186273382prettyprint" style=3D"background-color:=
rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-wi=
dth:1px"><code class=3D"m_-1443453422475211204m_-8487499323186273382prettyp=
rint"><div class=3D"m_-1443453422475211204m_-8487499323186273382subprettypr=
int"><span class=3D"m_-1443453422475211204m_-8487499323186273382styled-by-p=
rettify" style=3D"color:#008">struct</span><span class=3D"m_-14434534224752=
11204m_-8487499323186273382styled-by-prettify" style=3D"color:#000"> </span=
><span class=3D"m_-1443453422475211204m_-8487499323186273382styled-by-prett=
ify" style=3D"color:#660">{</span><span class=3D"m_-1443453422475211204m_-8=
487499323186273382styled-by-prettify" style=3D"color:#008">int</span><span =
class=3D"m_-1443453422475211204m_-8487499323186273382styled-by-prettify" st=
yle=3D"color:#000"> x </span><span class=3D"m_-1443453422475211204m_-848749=
9323186273382styled-by-prettify" style=3D"color:#660">=3D</span><span class=
=3D"m_-1443453422475211204m_-8487499323186273382styled-by-prettify" style=
=3D"color:#000"> </span><span class=3D"m_-1443453422475211204m_-84874993231=
86273382styled-by-prettify" style=3D"color:#066">1</span><span class=3D"m_-=
1443453422475211204m_-8487499323186273382styled-by-prettify" style=3D"color=
:#660">;</span><span class=3D"m_-1443453422475211204m_-8487499323186273382s=
tyled-by-prettify" style=3D"color:#000"> std</span><span class=3D"m_-144345=
3422475211204m_-8487499323186273382styled-by-prettify" style=3D"color:#660"=
>::</span><span class=3D"m_-1443453422475211204m_-8487499323186273382styled=
-by-prettify" style=3D"color:#008">string</span><span class=3D"m_-144345342=
2475211204m_-8487499323186273382styled-by-prettify" style=3D"color:#000"> y=
</span><span class=3D"m_-1443453422475211204m_-8487499323186273382styled-by=
-prettify" style=3D"color:#660">{</span><span class=3D"m_-14434534224752112=
04m_-8487499323186273382styled-by-prettify" style=3D"color:#080">"foo&=
quot;</span><span class=3D"m_-1443453422475211204m_-8487499323186273382styl=
ed-by-prettify" style=3D"color:#660">};</span><span class=3D"m_-14434534224=
75211204m_-8487499323186273382styled-by-prettify" style=3D"color:#000"> </s=
pan><span class=3D"m_-1443453422475211204m_-8487499323186273382styled-by-pr=
ettify" style=3D"color:#008">int</span><span class=3D"m_-144345342247521120=
4m_-8487499323186273382styled-by-prettify" style=3D"color:#000"> z </span><=
span class=3D"m_-1443453422475211204m_-8487499323186273382styled-by-prettif=
y" style=3D"color:#660">=3D</span><span class=3D"m_-1443453422475211204m_-8=
487499323186273382styled-by-prettify" style=3D"color:#000"> </span><span cl=
ass=3D"m_-1443453422475211204m_-8487499323186273382styled-by-prettify" styl=
e=3D"color:#066">6</span><span class=3D"m_-1443453422475211204m_-8487499323=
186273382styled-by-prettify" style=3D"color:#660">;}</span><span class=3D"m=
_-1443453422475211204m_-8487499323186273382styled-by-prettify" style=3D"col=
or:#000"> t</span><span class=3D"m_-1443453422475211204m_-84874993231862733=
82styled-by-prettify" style=3D"color:#660">;</span></div></code></div><div>=
<br></div></div></blockquote><div><br></div></div></div><div>Declaring an o=
bject of on-the-fly struct would be a solution if a struct's members co=
uld be declared auto. Unhappily they cannot, so this solution would only wo=
rk where types are well known. Of course the argument for introducing auto =
hinged on convenience of type deduction, particularly in template expansion=
s. This is a convenience I think we all enjoy. I would like to see this kin=
d of convenience extended.</div><div><br></div><div>As a side note, there i=
s exactly one core language feature in which the types of members is automa=
tically deduced - the lambda with capture. The automatic deduction is usefu=
l in this case, it might well be in others.<br></div><span class=3D""><div>=
=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Oh sure, y=
ou can't leave a member unnamed, but why would you<i> want to</i>? If t=
hat member is important enough to be stored and accessed, it's importan=
t enough to have a name.</div><div><br></div><div>`std::tuple` primarily ex=
ists for metaprogramming reasons (building structs, etc). If you're usi=
ng it in static code like the declaration above, you're almost always u=
sing the wrong tool.<br></div><span><div><br></div><blockquote class=3D"gma=
il_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;pa=
dding-left:1ex"><div dir=3D"ltr"><div><div><div class=3D"gmail_quote"><bloc=
kquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #cc=
c solid;padding-left:1ex"><div dir=3D"ltr"><div>No,
it's best to just leave things as they are. In those circumstances=20
where it is necessary to achieve what you want, you can still do it. But
the poor syntax and copying behavior will encourage you to avoid it=20
whenever possible.</div></div></blockquote><div><br></div><div>An "it&=
#39;s=20
best to leave things as they are" attitude would leave us with c+98 an=
d=20
prevent c++ ever becoming a mature fully-featured expressive language.=20
I'm afraid to say that I cannot take this statement seriously.<br></div=
></div></div></div></div></blockquote><div><br></div></span><div>I didn'=
;t say we should leave all of C++ as it is. I'm saying that we should l=
eave <i>this</i> as it is.</div><div><br></div><div>My problems with this r=
eally boil down to (in priority order):</div><div><br></div><div>1) It abus=
es structured binding, forcing it to do something that structured binding i=
sn't meant to do simply because it is convenient syntax.</div></div></b=
lockquote><div><br></div></span>Tuples and structures are _logically_ two f=
lavours of the same thing. We happen to talk about them as if they are diff=
erent for historic reasons, not logical ones. For me, the ability to sponta=
neously create an object of an arbitrary compound type, and inject the name=
s of its members into local scope seems useful. It is this feature that giv=
es python (for example) its wonderfully succinct list-comprehension syntax.=
<br></div><div class=3D"gmail_quote"><span class=3D"">=C2=A0<blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;pa=
dding-left:1ex"><div dir=3D"ltr"><div><br></div><div>2) The problems this s=
olves are not encountered frequently enough to override #1.</div></div></bl=
ockquote><div><br></div></span><div>Assertion. New tools create new opportu=
nities.<br></div><span class=3D""><div>=C2=A0</div><blockquote class=3D"gma=
il_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-lef=
t:1ex"><div dir=3D"ltr"><div><br></div><div>3) In a lot of the practical ca=
ses where this might be useful, there are better solutions that don't n=
eed it (like my range adaptor example).</div></div></blockquote><div><br></=
div></span><div>Building a new iterator type for every logical scenario is =
inconvenient and difficult to teach. It hides logic details. This is why ra=
nge-based-for was invented. "keep simple things simple".<br></div=
><span class=3D""><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div>4) It encourages writing ugly code. The more v=
ariables you shove into a `for` initializer, the more testing and increment=
ing expressions you need and the harder it is to follow the logic. This is =
a big part of why the range adaptor is preferred where possible; it hides t=
he ugly details.<br></div><span><div><br></div><blockquote class=3D"gmail_q=
uote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;paddin=
g-left:1ex"><div dir=3D"ltr"><div><div><div class=3D"gmail_quote"><div></di=
v><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:=
1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><span><blockquote class=
=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc s=
olid;padding-left:1ex"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><bl=
ockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #=
ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Remember:
they could have made `auto` do this exact thing when we standardized it
in 2011. But the committee expressly decided against it. All of the=20
reasons for not allowing it then are still just as valid now.<br></div></di=
v></blockquote><div><br></div><div>I
am not privy to the reasons. Are you able to elaborate please? I don't=
=20
think structured bindings were on the table back in 2011.<br></div></div></=
div></div></blockquote><div><br></div></span><div>I didn't say structur=
ed bindings. I said `auto`.</div></div></blockquote><div><br></div><div>Mea=
culpa.<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div>Remember: what you want<i> is not structured b=
indings</i>.
Structured binding is about unpacking objects that store data into=20
multiple variable-like constructs. You don't have such a object, and yo=
u
don't really want one. The only reason you created a tuple of values=
=20
was because structured binding <i>requires</i> it.</div><div><br></div><div=
>What
you really want is the ability to declare multiple variables of=20
different types in a single declaration statement. When `auto` was being
standardized, there was discussion about allowing precisely that:</div><di=
v><br></div><div style=3D"border:1px solid rgb(187,187,187);word-wrap:break=
-word;background-color:rgb(250,250,250)"><code><div><span style=3D"color:#0=
08">auto</span><span style=3D"color:#000"> x </span><span style=3D"color:#6=
60">=3D</span><span style=3D"color:#000"> </span><span style=3D"color:#066"=
>5.0f</span><span style=3D"color:#660">,</span><span style=3D"color:#000"> =
y </span><span style=3D"color:#660">=3D</span><span style=3D"color:#000"> <=
/span><span style=3D"color:#066">10</span><span style=3D"color:#660">,</spa=
n><span style=3D"color:#000"> z </span><span style=3D"color:#660">=3D</span=
><span style=3D"color:#000"> std</span><span style=3D"color:#660">::</span>=
<span style=3D"color:#008">string</span><span style=3D"color:#660">(</span>=
<span style=3D"color:#080">"foo"</span><span style=3D"color:#660"=
>);</span><span style=3D"color:#000"><br></span></div></code></div><br><div=
>These would deduce 3 different types for the 3 variables. The committee sp=
ecifically decided<i> against</i> doing this.</div></div></blockquote><div>=
<br></div><div>Deciding
against this seems to me to have been, in hindsight, the wrong=20
decision. Perhaps this error can be corrected in a future standard?</div></=
div></div></div></div></blockquote><div><br></div></span><div>Well, changin=
g it is possible. At present, [dcl.spec.auto]/7 says:</div><div><br></div><=
div>>
The type of each declared variable is determined by placeholder type=20
deduction (10.1.7.4.1), and if the type that replaces the placeholder=20
type is not the same in each deduction, the program is ill-formed.</div><di=
v><br></div><div>This
means that every declaration which would deduce different types is at=20
present illegal. So removing this restriction would not break any=20
currently legal code.</div><div><br></div><div>And this change would be a <=
i>lot</i>
more palatable than (ab)using structured binding for this purpose. It=20
would also have semantics that are more immediately obvious than those=20
for (ab)using structured binding in this way.<br></div><div><br></div><div>=
Though personally, I still think it's a bad idea.<br></div></div></bloc=
kquote><div><br></div></span><div>Do you mind explaining why? Because to me=
it seems like a splendid idea. To me, <span style=3D"font-family:monospace=
,monospace">auto x =3D foo(), y =3D bar();</span> seems succinct and neat. =
Someone who didn't know the language would read this and naturally conc=
lude that x and y may be of different types.<br></div><span class=3D""><blo=
ckquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #c=
cc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><span><div><br></div=
><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div><div cl=
ass=3D"gmail_quote"><div>I have yet to see a reasonable rationalisation (in=
the light of since-gathered experience) of this decision.<br></div></div><=
/div></div></div></blockquote><div><br></div></span><div>It's you who h=
ave to come up with a rationalization <i>for</i>
the change, not the other way around. If "the light of since-gathered=
=20
experience" really is on your side, you ought to be able to look at al=
l=20
of the old arguments against it and answer them one-by-one based on that
experience.</div></div></blockquote><div><br></div></span><div>For one, it=
's more naturally logical to imagine that an auto variable will have th=
e type of its initialiser.=C2=A0 <br></div><span class=3D""><blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;pa=
dding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Be sure to bring up th=
e Range TS Iterator/Sentinel paradigm. That's <i>always</i> a slam-dunk=
when it comes to deducing the same type ;)<br></div></div></blockquote><di=
v><br></div><div><br></div></span><div>I'm not sure what you mean here.=
In any range-based algorithm you will certainly want the ability for the i=
terator to be of a different type to the sentinel. multi-typed auto would h=
elp this.<br></div><span class=3D""><div>=C2=A0</div><blockquote class=3D"g=
mail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-l=
eft:1ex"><div dir=3D"ltr"><div></div><div><br></div><div>The
`auto` proposals for C++11 are all still available from the committee'=
s
website. Feel free to download them and start working through the=20
counter-arguments.<br></div><div><br></div><blockquote class=3D"gmail_quote=
" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-le=
ft:1ex">
</blockquote></div><span>
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@isoc<wbr>pp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/c8d3dd9a-69c7-4586-b0d3-cec9122c8b6a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/is<wbr>ocpp.org/d/msgid/std-proposals<wbr>/c8d3=
dd9a-69c7-4586-b0d3-<wbr>cec9122c8b6a%40isocpp.org</a>.<br>
</blockquote></span></div><br></div></div>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CALvx3hYqju17KotXw9cB1kvsvR4EJ2K0-r_L=
O-rnDnTsLVJr%3Dg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hYqju17Ko=
tXw9cB1kvsvR4EJ2K0-r_LO-rnDnTsLVJr%3Dg%40mail.gmail.com</a>.<br />
--001a113f64761f937805604c25be--
.
Author: David Brown <david@westcontrol.com>
Date: Thu, 14 Dec 2017 15:16:23 +0100
Raw View
On 14/12/17 13:37, Richard Hodges wrote:
> Having pondered the responses, it turns out that I can express my
> algorithm in a tightly scoped, DRY and legal manner in current c++ like
> this:
>
>
> // imagine there is an f(auto&& elem, auto&& index)
>
> using std::begin, std::end;
> [&f, i = std::size_t(0), first = begin(v), last = end(v)]() mutable
> {
> while(first != last)
> f(*first++, i++);
> }();
>
> This is of course a horrid abuse of lambdas and is certainly the kind of
> code that should be discouraged - except that it's actually doing what I
> want - which is allowing me to create more than one loop-scoped variable
> in a template-friendly manner.
> Of course, I could write a function for this, but in reality what I am
> doing here is a 2-liner. It doesn't warrant figuring out a reasonable
> function name, documenting the function and deciding which header file
> it'll live in (forever).
>
> Horrid as it is, what it shows is that we are already familiar with the
> syntax of enumerating variable creation and allowing the compiler to
> generate a class (tuple) for us.
>
> I really do think that there is a case for allowing:
>
> for(auto [i = std::size_t(0)] ; auto&& elem : v)
> f(elem, i++);
>
> or:
>
> for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ; first
> != last ; ++first, ++i)
> f(*first, i);
>
> or:
>
> for(auto i = std::size_t(0), first = begin(v), last = end(v) ; first !=
> last ; ++first, ++i)
> f(*first, i);
>
> since we already have this ability in the nasty lambda above, why not
> provide the ability in a way that's easy to reason about?
>
>
You can currently use the syntax of this last version in some cases -
but it means something slightly different. Multiple variables declared
in one "auto" declaration need the same type.
I would go for the syntax:
for (auto i = std::size_t(0); auto first = begin(v); auto last = end(v);
first != last; ++first, ++i) { ... }
Simply allow as many initialiser declarations as you want - using auto
or specific types. There should be no problem in parsing - the last two
clauses are still in the same place. And the same idea can apply to
while(), if(), etc.
An alternative would be a more generic language change - allow a
declaration of the form "t1 x1, t2 x2;" to have the same meaning as "t1
x1; t2 x2;".
If there is to be a proposal to allow initialisers with more than one
type here, I don't think it should be restricted to "auto" - I think we
want it to include specific types, and concepts. Thus structured
bindings is not the answer.
--
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/p0u13f%24msc%241%40blaine.gmane.org.
.
Author: adrian.hawryluk@gmail.com
Date: Thu, 14 Dec 2017 06:27:58 -0800 (PST)
Raw View
------=_Part_2807_1063434985.1513261678929
Content-Type: text/plain; charset="UTF-8"
> I'm sure some people do this, but an indexed range view would handle this much more easily and compactly:
>
> for(auto &[i, val] : std::counted_view(rng))
> {...}
What standard is that from? Couldn't find it when searching for std counted_view.
--
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/ab23902d-ade4-480c-93d9-7efb55eebe19%40isocpp.org.
------=_Part_2807_1063434985.1513261678929--
.
Author: adrian.hawryluk@gmail.com
Date: Thu, 14 Dec 2017 06:34:51 -0800 (PST)
Raw View
------=_Part_2839_1983158397.1513262091133
Content-Type: text/plain; charset="UTF-8"
> I'm sure some people do this, but an indexed range view would handle this much more easily and compactly:
> for(auto &[i, val] : std::counted_view(rng))
> {...}
I've also never seen `auto &[i, val]` as a variable declaration consruct before. Is that c++17?
--
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/0a1c616b-b5cd-404c-b523-fe168f3ca878%40isocpp.org.
------=_Part_2839_1983158397.1513262091133--
.
Author: Richard Hodges <hodges.r@gmail.com>
Date: Thu, 14 Dec 2017 16:00:28 +0100
Raw View
--001a114aad7812a81b05604e2580
Content-Type: text/plain; charset="UTF-8"
> I'm sure some people do this, but an indexed range view would handle this
much more easily and compactly:
>
> for(auto &[i, val] : std::counted_view(rng))
> {...}
There is currently no such thing as a std::counted_view but I take your
point. The problems with this approach are:
1. You have to think of a meaningful name for every trivial range
adapter you ever want to write. This is a bigger problem in a large
organisation or distributed team that it might at first seem.
2. Range adapters involve abstracting out one's algorithm into a verbose
class. Precisely the opposite of the intent of range-based for (keep simple
things simple, keep logic in the loop body)
3. You have to document and publish what is essentially a line or 2 of
trivial self-documenting code.
4. You have to wait for at least 3 years of squabbling in the isocpp
committee before it'll be in the std namespace*
* ok, fair enough, you could submit it to boost and get it out in 3 months
if you're happy with boost::counted_view.
On 14 December 2017 at 15:34, <adrian.hawryluk@gmail.com> wrote:
> > I'm sure some people do this, but an indexed range view would handle
> this much more easily and compactly:
>
> > for(auto &[i, val] : std::counted_view(rng))
> > {...}
>
> I've also never seen `auto &[i, val]` as a variable declaration consruct
> before. Is that c++17?
>
Yes, that's a structured binding. It unpacks a tuple or struct into (in
this case) two references in the current scope.
>
> --
> 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/0a1c616b-b5cd-404c-
> b523-fe168f3ca878%40isocpp.org.
>
--
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/CALvx3hZWY2K4qzXfnV9QFjkT-7XgjgRAeEjFz2sV1Xz34yjqXA%40mail.gmail.com.
--001a114aad7812a81b05604e2580
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><span style=3D"color:rgb(80,0,80);font-size:12.8px">> I=
'm sure some people do this, but an indexed range view would handle thi=
s much more easily and compactly:</span><br style=3D"color:rgb(80,0,80);fon=
t-size:12.8px"><span style=3D"color:rgb(80,0,80);font-size:12.8px">></sp=
an><br style=3D"color:rgb(80,0,80);font-size:12.8px"><span style=3D"color:r=
gb(80,0,80);font-size:12.8px">> for(auto &[i, val] : std::counted_vi=
ew(rng))</span><br style=3D"color:rgb(80,0,80);font-size:12.8px"><span styl=
e=3D"color:rgb(80,0,80);font-size:12.8px">> {...}</span><br style=3D"col=
or:rgb(80,0,80);font-size:12.8px"><div class=3D"gmail_extra"><br></div><div=
class=3D"gmail_extra">There is currently no such thing as a std::counted_v=
iew but I take your point. The problems with this approach are:</div><div c=
lass=3D"gmail_extra"><br></div><div class=3D"gmail_extra"><ol><li>You have =
to think of a meaningful name for every trivial range adapter you ever want=
to write. This is a bigger problem in a large organisation or distributed =
team that it might at first seem.</li><li>Range adapters involve abstractin=
g out one's algorithm into a verbose class. Precisely the opposite of t=
he intent of range-based for (keep simple things simple, keep logic in the =
loop body)</li><li>You have to document and publish what is essentially a l=
ine or 2 of trivial self-documenting code.</li><li>You have to wait for at =
least 3 years of squabbling in the isocpp committee before it'll be in =
the std namespace*</li></ol><div>* ok, fair enough, you could submit it to =
boost and get it out in 3 months if you're happy with boost::counted_vi=
ew.</div><div><br></div></div><div class=3D"gmail_extra"><br><div class=3D"=
gmail_quote">On 14 December 2017 at 15:34, <span dir=3D"ltr"><<a href=
=3D"mailto:adrian.hawryluk@gmail.com" target=3D"_blank">adrian.hawryluk@gma=
il.com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"=
margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-lef=
t:1ex"><span class=3D"gmail-">> I'm sure some people do this, but an=
indexed range view would handle this much more easily and compactly:<br>
<br>
> for(auto &[i, val] : std::counted_view(rng))<br>
> {...}<br>
<br>
</span>I've also never seen `auto &[i, val]` as a variable declarat=
ion consruct before. Is that c++17?<br></blockquote><div><br></div><div>Yes=
, that's a structured binding. It unpacks a tuple or struct into (in th=
is case) two references in the current scope.=C2=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg=
b(204,204,204);padding-left:1ex">
<span class=3D"gmail-"><br>
--<br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org">std-propo=
sals+unsubscribe@<wbr>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>
</span>To view this discussion on the web visit <a href=3D"https://groups.g=
oogle.com/a/isocpp.org/d/msgid/std-proposals/0a1c616b-b5cd-404c-b523-fe168f=
3ca878%40isocpp.org" rel=3D"noreferrer" target=3D"_blank">https://groups.go=
ogle.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/0a1c616b-b5cd-404c-<w=
br>b523-fe168f3ca878%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CALvx3hZWY2K4qzXfnV9QFjkT-7XgjgRAeEjF=
z2sV1Xz34yjqXA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hZWY2K4qzXf=
nV9QFjkT-7XgjgRAeEjFz2sV1Xz34yjqXA%40mail.gmail.com</a>.<br />
--001a114aad7812a81b05604e2580--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Thu, 14 Dec 2017 09:19:47 -0800 (PST)
Raw View
------=_Part_3297_526296050.1513271987541
Content-Type: multipart/alternative;
boundary="----=_Part_3298_581109901.1513271987543"
------=_Part_3298_581109901.1513271987543
Content-Type: text/plain; charset="UTF-8"
On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:
>
> I won't dwell too much, just a couple of comments:
> On 14 December 2017 at 00:48, Nicol Bolas <jmck...@gmail.com <javascript:>
> > wrote:
>
>> On Wednesday, December 13, 2017 at 5:22:11 PM UTC-5, Richard Hodges wrote:
>>>
>>> inline....
>>>
>>> On 13 December 2017 at 18:05, Nicol Bolas <*jmck...@gmail.com*> wrote:
>>>
>>>> On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges
>>>> wrote:
>>>>
>>> Either support it in the core language or don't. The current half and
>>> half approach is an error. why shouldn't I be able to say:
>>>
>>> auto t = auto [x = int(1), y = std::string("foo"), 6]; // get<0>(t) ==
>>> 1, get<1>(t) == "foo", get<2>(t) == 6
>>>
>>> such an expression is expressive, succinct and useful. I can manipulate
>>> the tuple either as a complete object or as individual objects. Great!
>>>
>>
>> I fail to see how that is an improvement over using a tuple. And quite
>> frankly, we already have ways of declaring a type:
>>
>> struct {int x = 1; std::string y{"foo"}; int z = 6;} t;
>>
>>
> Declaring an object of on-the-fly struct would be a solution if a struct's
> members could be declared auto.
>
Seriously, what is it with people and `auto`? Why are you so allergic to
typenames? That structure as it stands is far more readable than the "auto"
version would be.
Thinking like this makes me rue the day the committee ever standardized
`auto` variable deduction. People keep trying to take a useful tool for
dealing with obvious code and long typenames, and turning it into the thing
that must be used everywhere.
Let's not standardize the Almost-Always-Auto ideology.
Unhappily they cannot, so this solution would only work where types are
> well known. Of course the argument for introducing auto hinged on
> convenience of type deduction, particularly in template expansions. This is
> a convenience I think we all enjoy. I would like to see this kind of
> convenience extended.
>
"Convenience" of this sort often creates ambiguity and confusion. Having to
use a typename is not some kind of onerous burden here.
As a side note, there is exactly one core language feature in which the
> types of members is automatically deduced - the lambda with capture. The
> automatic deduction is useful in this case, it might well be in others.
>
That's because lambdas have to be short to be useful, particularly the
capture list. The main point of a lambda is not what it captures but the
actual function it encapsulates. The capture part is an unfortunate
implementation detail that we try to minimize where possible.
That is, the point of a lambda is the function part, not the functor part.
The functor part is an implementation detail required by the way C++ works.
Making struct definitions shorter makes them harder to reason about and
digest, and gives precious little back in return.
No, it's best to just leave things as they are. In those circumstances
>>>> where it is necessary to achieve what you want, you can still do it. But
>>>> the poor syntax and copying behavior will encourage you to avoid it
>>>> whenever possible.
>>>>
>>>
>>> An "it's best to leave things as they are" attitude would leave us with
>>> c+98 and prevent c++ ever becoming a mature fully-featured expressive
>>> language. I'm afraid to say that I cannot take this statement seriously.
>>>
>>
>> I didn't say we should leave all of C++ as it is. I'm saying that we
>> should leave *this* as it is.
>>
>> My problems with this really boil down to (in priority order):
>>
>> 1) It abuses structured binding, forcing it to do something that
>> structured binding isn't meant to do simply because it is convenient syntax.
>>
>
> Tuples and structures are _logically_ two flavours of the same thing. We
> happen to talk about them as if they are different for historic reasons,
> not logical ones.
>
.... I don't know what that has to do with what I said. Your statement only
makes sense if you think of structured binding as a feature invented for
tuples. It's not. It works just fine with decomposeable structs, and you
can write machinery to make them decomposeable when they're not
automatically decomposeable.
For me, the ability to spontaneously create an object of an arbitrary
> compound type, and inject the names of its members into local scope seems
> useful. It is this feature that gives python (for example) its wonderfully
> succinct list-comprehension syntax.
>
That doesn't justify abusing structured binding to do that. If you really
believe that the ability to create a type and make local variables of its
members is useful (and I've yet to see how), then you should create a
feature that is specifically about that.
Structured binding is about unpacking an existing object, not about
creating types. Don't abuse a syntax for an unrelated feature just because
it's convenient.
2) The problems this solves are not encountered frequently enough to
>> override #1.
>>
>
> Assertion. New tools create new opportunities.
>
Also an assertion. What "new opportunities" does this create?
3) In a lot of the practical cases where this might be useful, there are
>> better solutions that don't need it (like my range adaptor example).
>>
>
> Building a new iterator type for every logical scenario is inconvenient
> and difficult to teach. It hides logic details.
>
Hiding details for complex iteration scenarios is exactly what you* ought*
to do. Show me the code using a non-range adaptor that iterates over two
ranges, accessing the value from each range. Feel free to use whatever
`auto` syntax you want to initialize multiple variables. But you're not
allowed to use a standard library algorithm.
Now compare that `for` loop to the range adapter version:
for(auto &[first, second] : zip_range(rng_first, rng_second))
{}
There's no contest here. Hiding the "logical details" makes this code* far*
more convenient and easier to teach. The same goes for so many iteration
scenarios. Iterating over a group of ranges in sequence. Iterating over
each range in turn. And so on.
The more iteration variables you see in a loop declaration, the more
iterator expressions it has, the harder it is to follow the logic. Those
ranges are idiomatic and easily comprehensible.
There will* always* be corner cases, one-off iteration scenarios where
existing tools don't quite match what you need. But those are* corner cases*;
we don't build language features just for corner cases.
If a "logical scenario" is frequently encountered, and it fits into the
range paradigm, then making a range type for it is precisely what one ought
to do.
This is why range-based-for was invented. "keep simple things simple".'
>
And the point of range adaptors is to do precisely that. Iterating over a
pair of range or a sequence of ranges ought to be a simple thing. And with
range adaptors, they are.
With your idea, it makes them difficult to work with.
Remember: what you want* is not structured bindings*. Structured binding is
>>>> about unpacking objects that store data into multiple variable-like
>>>> constructs. You don't have such a object, and you don't really want one.
>>>> The only reason you created a tuple of values was because structured
>>>> binding *requires* it.
>>>>
>>>> What you really want is the ability to declare multiple variables of
>>>> different types in a single declaration statement. When `auto` was being
>>>> standardized, there was discussion about allowing precisely that:
>>>>
>>>> auto x = 5.0f, y = 10, z = std::string("foo");
>>>>
>>>> These would deduce 3 different types for the 3 variables. The committee
>>>> specifically decided* against* doing this.
>>>>
>>>
>>> Deciding against this seems to me to have been, in hindsight, the wrong
>>> decision. Perhaps this error can be corrected in a future standard?
>>>
>>
>> Well, changing it is possible. At present, [dcl.spec.auto]/7 says:
>>
>> > The type of each declared variable is determined by placeholder type
>> deduction (10.1.7.4.1), and if the type that replaces the placeholder type
>> is not the same in each deduction, the program is ill-formed.
>>
>> This means that every declaration which would deduce different types is
>> at present illegal. So removing this restriction would not break any
>> currently legal code.
>>
>> And this change would be a *lot* more palatable than (ab)using
>> structured binding for this purpose. It would also have semantics that are
>> more immediately obvious than those for (ab)using structured binding in
>> this way.
>>
>> Though personally, I still think it's a bad idea.
>>
>
> Do you mind explaining why? Because to me it seems like a splendid idea.
> To me, auto x = foo(), y = bar(); seems succinct and neat. Someone who
> didn't know the language would read this and naturally conclude that x and
> y may be of different types.
>
I don't like it precisely *because* it encourages you to type `auto x =
foo(), y = bar();`. Those are two independent operations; two separate
components of whatever algorithm you're writing. Unless there is some
obvious connection between `foo` and `bar`, they have no business being on
the same line.
It's bad coding style, and it ought to fail code review.
I have yet to see a reasonable rationalisation (in the light of
>> since-gathered experience) of this decision.
>>
>> It's you who have to come up with a rationalization *for* the change,
>> not the other way around. If "the light of since-gathered experience"
>> really is on your side, you ought to be able to look at all of the old
>> arguments against it and answer them one-by-one based on that experience.
>>
>
> For one, it's more naturally logical to imagine that an auto variable will
> have the type of its initialiser.
>
That's not an answer to those arguments. Indeed, you didn't even state what
those arguments are.
Be sure to bring up the Range TS Iterator/Sentinel paradigm. That's *always*
>> a slam-dunk when it comes to deducing the same type ;)
>>
>
> I'm not sure what you mean here. In any range-based algorithm you will
> certainly want the ability for the iterator to be of a different type to
> the sentinel. multi-typed auto would help this.
>
.... right. Which is why I said you* should* bring it up. I wasn't being
sarcastic.
Consider what I just said about having two "independent operations" on the
same line. If you're extracting begin/end from a range, then those* aren't*
"two independent operations". They're a single logical thought:
auto beg = rng.begin(), end = rng.end();
When you have something that is conceptually atomic that, by reason of
implementation, requires two distinct actions,* that* is when it is
appropriate to stick them in one line.
Of course, you'll naturally try to say that getting iterators for two
separate ranges is also a single logical thought to your algorithm. But I
contest this because they're not atomic actions. Getting the beginning of a
range is useless without getting its end (in most cases). That's what makes
the pair of actions "atomic"; you can't do *anything* with them until both
are complete.
However, getting one iterator range can be useful without getting some
other iterator range. It may not be useful to* your* algorithm, but it is
still useful in the general sense.
That's my personal dividing line.
On Thursday, December 14, 2017 at 7:37:22 AM UTC-5, Richard Hodges wrote:
>
> Having pondered the responses, it turns out that I can express my
> algorithm in a tightly scoped, DRY and legal manner in current c++ like
> this:
>
I'm not really sure what that proves. You can accomplish the same thing by
using curly braces:
{
std::size_t ix = 0;
auto first = begin(v);
auto last = end(v);
for(; first != last; ++first, ++ix)
//Actual loop body;
}
You can even remove the `begin` line by adding it to the `for` statement.
So what's the downside of this? Do you really need to write these
multi-variable things* that often* that we need a language change? You've
not answered that question.
I really do think that there is a case for allowing:
>
> for(auto [i = std::size_t(0)] ; auto&& elem : v)
> f(elem, i++);
>
> or:
>
> for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ;
> first != last ; ++first, ++i)
> f(*first, i);
>
> or:
>
> for(auto i = std::size_t(0), first = begin(v), last = end(v) ; first
> != last ; ++first, ++i)
> f(*first, i);
>
> since we already have this ability in the nasty lambda above, why not
> provide the ability in a way that's easy to reason about?
>
You can already do the first one; just get rid of the structured binding
bit. And the second and third ones have nothing to do with one another.
They have completely different semantics.
>
--
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/79fdf8b2-08e8-4889-a1b6-50f0f05eb0d0%40isocpp.org.
------=_Part_3298_581109901.1513271987543
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richar=
d Hodges 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=
">I won't dwell too much, just a couple of comments:<br><div><div class=
=3D"gmail_quote">On 14 December 2017 at 00:48, Nicol Bolas <span dir=3D"ltr=
"><<a onmousedown=3D"this.href=3D'javascript:';return true;" onc=
lick=3D"this.href=3D'javascript:';return true;" href=3D"javascript:=
" target=3D"_blank" rel=3D"nofollow" gdf-obfuscated-mailto=3D"VvdRCyXCAAAJ"=
>jmck...@gmail.com</a>></span> wrote:<br><blockquote class=3D"gmail_quot=
e" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">=
<div dir=3D"ltr"><span>On Wednesday, December 13, 2017 at 5:22:11 PM UTC-5,=
Richard Hodges wrote:</span><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">inline....<br><div><div><br><div class=3D"gmail_quote"><span>On =
13 December 2017 at 18:05, Nicol Bolas <span dir=3D"ltr"><<a rel=3D"nofo=
llow"><u><font color=3D"#0066cc">jmck...@gmail.com</font></u></a>></span=
> wrote:<br></span><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 =
..8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><span><s=
pan>On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges wr=
ote:</span></span><span>=C2=A0</span></div></blockquote></div></div></div><=
/div></blockquote><span><blockquote class=3D"gmail_quote" style=3D"margin:0=
;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D=
"ltr"><div><div><div class=3D"gmail_quote"><div>Either support it in the co=
re language or don't. The current half and half approach is an error. w=
hy shouldn't I be able to say:</div><div><br></div><div><span style=3D"=
font-family:monospace,monospace">auto t =3D auto [x =3D int(1), y =3D std::=
string("foo"), 6];=C2=A0 // get<0>(t) =3D=3D 1, get<1>=
;(t) =3D=3D "foo", get<2>(t) =3D=3D 6<br></span></div><div>=
=C2=A0 <br></div><div>such
an expression is expressive, succinct and useful. I can manipulate the=20
tuple either as a complete object or as individual objects. Great!</div></d=
iv></div></div></div></blockquote><div><br></div></span><div>I fail to see =
how that is an improvement over using a tuple. And quite frankly, we alread=
y have ways of declaring a type:</div><div><br></div><div style=3D"backgrou=
nd-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;=
border-width:1px"><code><div><span style=3D"color:#008">struct</span><span =
style=3D"color:#000"> </span><span style=3D"color:#660">{</span><span style=
=3D"color:#008">int</span><span style=3D"color:#000"> x </span><span style=
=3D"color:#660">=3D</span><span style=3D"color:#000"> </span><span style=3D=
"color:#066">1</span><span style=3D"color:#660">;</span><span style=3D"colo=
r:#000"> std</span><span style=3D"color:#660">::</span><span style=3D"color=
:#008">string</span><span style=3D"color:#000"> y</span><span style=3D"colo=
r:#660">{</span><span style=3D"color:#080">"foo"</span><span styl=
e=3D"color:#660">};</span><span style=3D"color:#000"> </span><span style=3D=
"color:#008">int</span><span style=3D"color:#000"> z </span><span style=3D"=
color:#660">=3D</span><span style=3D"color:#000"> </span><span style=3D"col=
or:#066">6</span><span style=3D"color:#660">;}</span><span style=3D"color:#=
000"> t</span><span style=3D"color:#660">;</span></div></code></div><div><b=
r></div></div></blockquote><div><br></div><div>Declaring an object of on-th=
e-fly struct would be a solution if a struct's members could be declare=
d auto.</div></div></div></div></blockquote><div><br></div><div>Seriously, =
what is it with people and `auto`? Why are you so allergic to typenames? Th=
at structure as it stands is far more readable than the "auto" ve=
rsion would be.</div><div><br></div><div>Thinking like this makes me rue th=
e day the committee ever standardized `auto` variable deduction. People kee=
p trying to take a useful tool for dealing with obvious code and long typen=
ames, and turning it into the thing that must be used everywhere.</div><div=
><br></div><div>Let's not standardize the Almost-Always-Auto ideology.<=
/div><div><br></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"><div><div class=3D"gmail_quote"><div>Unhappily they cannot, so thi=
s solution would only work where types are well known. Of course the argume=
nt for introducing auto hinged on convenience of type deduction, particular=
ly in template expansions. This is a convenience I think we all enjoy. I wo=
uld like to see this kind of convenience extended.</div></div></div></div><=
/blockquote><div><br></div><div>"Convenience" of this sort often =
creates ambiguity and confusion. Having to use a typename is not some kind =
of onerous burden here.</div><div><br></div><blockquote class=3D"gmail_quot=
e" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;paddin=
g-left: 1ex;"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><div>As a si=
de note, there is exactly one core language feature in which the types of m=
embers is automatically deduced - the lambda with capture. The automatic de=
duction is useful in this case, it might well be in others.<br></div></div>=
</div></div></blockquote><div><br></div><div>That's because lambdas hav=
e to be short to be useful, particularly the capture list. The main point o=
f a lambda is not what it captures but the actual function it encapsulates.=
The capture part is an unfortunate implementation detail that we try to mi=
nimize where possible.</div><div><br></div><div>That is, the point of a lam=
bda is the function part, not the functor part. The functor part is an impl=
ementation detail required by the way C++ works.</div><div><br></div><div>M=
aking struct definitions shorter makes them harder to reason about and dige=
st, and gives precious little back in return.</div><div><span><br></span></=
div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex=
;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><div=
class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0 =
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><spa=
n><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"><div><div><div c=
lass=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0 0 =
0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>N=
o,
it's best to just leave things as they are. In those circumstances=20
where it is necessary to achieve what you want, you can still do it. But
the poor syntax and copying behavior will encourage you to avoid it=20
whenever possible.</div></div></blockquote><div><br></div><div>An "it&=
#39;s=20
best to leave things as they are" attitude would leave us with c+98 an=
d=20
prevent c++ ever becoming a mature fully-featured expressive language.=20
I'm afraid to say that I cannot take this statement seriously.<br></div=
></div></div></div></div></blockquote><div><br></div></span><div>I didn'=
;t say we should leave all of C++ as it is. I'm saying that we should l=
eave <i>this</i> as it is.</div><div><br></div><div>My problems with this r=
eally boil down to (in priority order):</div><div><br></div><div>1) It abus=
es structured binding, forcing it to do something that structured binding i=
sn't meant to do simply because it is convenient syntax.</div></div></b=
lockquote><div><br></div>Tuples and structures are _logically_ two flavours=
of the same thing. We happen to talk about them as if they are different f=
or historic reasons, not logical ones.</div></div></div></blockquote><div><=
br></div><div>... I don't know what that has to do with what I said. Yo=
ur statement only makes sense if you think of structured binding as a featu=
re invented for tuples. It's not. It works just fine with decomposeable=
structs, and you can write machinery to make them decomposeable when they&=
#39;re not automatically decomposeable.</div><div><br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #=
ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><div class=3D"gmail_quo=
te">For me, the ability to spontaneously create an object of an arbitrary c=
ompound type, and inject the names of its members into local scope seems us=
eful. It is this feature that gives python (for example) its wonderfully su=
ccinct list-comprehension syntax.<br></div></div></div></blockquote><div><b=
r></div><div>That doesn't justify abusing structured binding to do that=
.. If you really believe that the ability to create a type and make local va=
riables of its members is useful (and I've yet to see how), then you sh=
ould create a feature that is specifically about that.</div><div><br></div>=
<div>Structured binding is about unpacking an existing object, not about cr=
eating types. Don't abuse a syntax for an unrelated feature just becaus=
e it's convenient.</div><div><br></div><blockquote class=3D"gmail_quote=
" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding=
-left: 1ex;"><div dir=3D"ltr"><div><div class=3D"gmail_quote"></div><div cl=
ass=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0=
.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>2)=
The problems this solves are not encountered frequently enough to override=
#1.</div></div></blockquote><div><br></div><div>Assertion. New tools creat=
e new opportunities.<br></div></div></div></div></blockquote><div><br></div=
><div>Also an assertion. What "new opportunities" does this creat=
e?</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin: 0=
;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div di=
r=3D"ltr"><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote"=
style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><d=
iv dir=3D"ltr"><div>3) In a lot of the practical cases where this might be =
useful, there are better solutions that don't need it (like my range ad=
aptor example).</div></div></blockquote><div><br></div><div>Building a new =
iterator type for every logical scenario is inconvenient and difficult to t=
each. It hides logic details.</div></div></div></div></blockquote><div><br>=
</div><div>Hiding details for complex iteration scenarios is exactly what y=
ou<i> ought</i> to do. Show me the code using a non-range adaptor that iter=
ates over two ranges, accessing the value from each range. Feel free to use=
whatever `auto` syntax you want to initialize multiple variables. But you&=
#39;re not allowed to use a standard library algorithm.</div><div><br></div=
><div>Now compare that `for` loop to the range adapter version:</div><div><=
br></div><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"styled-=
by-prettify" style=3D"color: #008;">for</span><span class=3D"styled-by-pret=
tify" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #008;">auto</span><span class=3D"styled-by-prettify" style=3D"=
color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #6=
60;">&[</span><span class=3D"styled-by-prettify" style=3D"color: #000;"=
>first</span><span class=3D"styled-by-prettify" style=3D"color: #660;">,</s=
pan><span class=3D"styled-by-prettify" style=3D"color: #000;"> second</span=
><span class=3D"styled-by-prettify" style=3D"color: #660;">]</span><span cl=
ass=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"st=
yled-by-prettify" style=3D"color: #660;">:</span><span class=3D"styled-by-p=
rettify" style=3D"color: #000;"> zip_range</span><span class=3D"styled-by-p=
rettify" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" =
style=3D"color: #000;">rng_first</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #660;">,</span><span class=3D"styled-by-prettify" style=3D"c=
olor: #000;"> rng_second</span><span class=3D"styled-by-prettify" style=3D"=
color: #660;">))</span><span class=3D"styled-by-prettify" style=3D"color: #=
000;"><br></span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
{}</span></div></code></div><div><br></div><div>There's no contest here=
.. Hiding the "logical details" makes this code<i> far</i> more co=
nvenient and easier to teach. The same goes for so many iteration scenarios=
.. Iterating over a group of ranges in sequence. Iterating over each range i=
n turn. And so on.</div><div><br></div><div>The more iteration variables yo=
u see in a loop declaration, the more iterator expressions it has, the hard=
er it is to follow the logic. Those ranges are idiomatic and easily compreh=
ensible.</div><div><br></div><div>There will<i> always</i> be corner cases,=
one-off iteration scenarios where existing tools don't quite match wha=
t you need. But those are<i> corner cases</i>; we don't build language =
features just for corner cases.</div><div><br></div><div>If a "logical=
scenario" is frequently encountered, and it fits into the range parad=
igm, then making a range type for it is precisely what one ought to do.</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><div class=3D"gmail_quote"><div>This is why range-based-for was in=
vented. "keep simple things simple".'<br></div></div></div></=
div></blockquote><div><br></div><div>And the point of range adaptors is to =
do precisely that. Iterating over a pair of range or a sequence of ranges o=
ught to be a simple thing. And with range adaptors, they are.</div><div><br=
></div><div>With your idea, it makes them difficult to work with.</div><div=
><span><br></span></div><blockquote class=3D"gmail_quote" style=3D"margin: =
0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div d=
ir=3D"ltr"><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote=
" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><=
div dir=3D"ltr"><span><blockquote class=3D"gmail_quote" style=3D"margin:0;m=
argin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"l=
tr"><div><div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" =
style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><di=
v dir=3D"ltr"><div>Remember: what you want<i> is not structured bindings</i=
>.
Structured binding is about unpacking objects that store data into=20
multiple variable-like constructs. You don't have such a object, and yo=
u
don't really want one. The only reason you created a tuple of values=
=20
was because structured binding <i>requires</i> it.</div><div><br></div><div=
>What
you really want is the ability to declare multiple variables of=20
different types in a single declaration statement. When `auto` was being
standardized, there was discussion about allowing precisely that:</div><di=
v><br></div><div style=3D"border:1px solid rgb(187,187,187);word-wrap:break=
-word;background-color:rgb(250,250,250)"><code><div><span style=3D"color:#0=
08">auto</span><span style=3D"color:#000"> x </span><span style=3D"color:#6=
60">=3D</span><span style=3D"color:#000"> </span><span style=3D"color:#066"=
>5.0f</span><span style=3D"color:#660">,</span><span style=3D"color:#000"> =
y </span><span style=3D"color:#660">=3D</span><span style=3D"color:#000"> <=
/span><span style=3D"color:#066">10</span><span style=3D"color:#660">,</spa=
n><span style=3D"color:#000"> z </span><span style=3D"color:#660">=3D</span=
><span style=3D"color:#000"> std</span><span style=3D"color:#660">::</span>=
<span style=3D"color:#008">string</span><span style=3D"color:#660">(</span>=
<span style=3D"color:#080">"foo"</span><span style=3D"color:#660"=
>);</span><span style=3D"color:#000"><br></span></div></code></div><br><div=
>These would deduce 3 different types for the 3 variables. The committee sp=
ecifically decided<i> against</i> doing this.</div></div></blockquote><div>=
<br></div><div>Deciding
against this seems to me to have been, in hindsight, the wrong=20
decision. Perhaps this error can be corrected in a future standard?</div></=
div></div></div></div></blockquote><div><br></div></span><div>Well, changin=
g it is possible. At present, [dcl.spec.auto]/7 says:</div><div><br></div><=
div>>
The type of each declared variable is determined by placeholder type=20
deduction (10.1.7.4.1), and if the type that replaces the placeholder=20
type is not the same in each deduction, the program is ill-formed.</div><di=
v><br></div><div>This
means that every declaration which would deduce different types is at=20
present illegal. So removing this restriction would not break any=20
currently legal code.</div><div><br></div><div>And this change would be a <=
i>lot</i>
more palatable than (ab)using structured binding for this purpose. It=20
would also have semantics that are more immediately obvious than those=20
for (ab)using structured binding in this way.<br></div><div><br></div><div>=
Though personally, I still think it's a bad idea.<br></div></div></bloc=
kquote><div><br></div><div>Do you mind explaining why? Because to me it see=
ms like a splendid idea. To me, <span style=3D"font-family:monospace,monosp=
ace">auto x =3D foo(), y =3D bar();</span> seems succinct and neat. Someone=
who didn't know the language would read this and naturally conclude th=
at x and y may be of different types.<br></div></div></div></div></blockquo=
te><div><br></div><div>I don't like it precisely <i>because</i> it enco=
urages you to type `auto x =3D foo(), y =3D bar();`. Those are two independ=
ent operations; two separate components of whatever algorithm you're wr=
iting. Unless there is some obvious connection between `foo` and `bar`, the=
y have no business being on the same line.</div><div><br></div><div>It'=
s bad coding style, and it ought to fail code review.</div><div><br></div><=
blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bord=
er-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div><div clas=
s=3D"gmail_quote"><div></div><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr=
"><div></div><span><div>I have yet to see a reasonable rationalisation (in =
the light of since-gathered experience) of this decision.<br></div><div><br=
></div></span><div>It's you who have to come up with a rationalization =
<i>for</i>
the change, not the other way around. If "the light of since-gathered=
=20
experience" really is on your side, you ought to be able to look at al=
l=20
of the old arguments against it and answer them one-by-one based on that
experience.</div></div></blockquote><div><br></div><div>For one, it's =
more naturally logical to imagine that an auto variable will have the type =
of its initialiser.<br></div></div></div></div></blockquote><div><br></div>=
<div>That's not an answer to those arguments. Indeed, you didn't ev=
en state what those arguments are.</div><div><br></div><blockquote class=3D=
"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc s=
olid;padding-left: 1ex;"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><=
div></div><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bord=
er-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Be sure to b=
ring up the Range TS Iterator/Sentinel paradigm. That's <i>always</i> a=
slam-dunk when it comes to deducing the same type ;)<br></div></div></bloc=
kquote><div><br></div><div>I'm not sure what you mean here. In any rang=
e-based algorithm you will certainly want the ability for the iterator to b=
e of a different type to the sentinel. multi-typed auto would help this.<br=
></div></div></div></div></blockquote><div><br></div><div>... right. Which =
is why I said you<i> should</i> bring it up. I wasn't being sarcastic.<=
/div><div><br></div><div>Consider what I just said about having two "i=
ndependent operations" on the same line. If you're extracting begi=
n/end from a range, then those<i> aren't</i> "two independent oper=
ations". They're a single logical thought:</div><div><br></div><di=
v 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"pr=
ettyprint"><div class=3D"subprettyprint"><span class=3D"styled-by-prettify"=
style=3D"color: #008;">auto</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> beg </span><span class=3D"styled-by-prettify" style=3D"c=
olor: #660;">=3D</span><span class=3D"styled-by-prettify" style=3D"color: #=
000;"> rng</span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
..</span><span class=3D"styled-by-prettify" style=3D"color: #008;">begin</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #660;">(),</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=
=3D"styled-by-prettify" style=3D"color: #008;">end</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-pr=
ettify" style=3D"color: #660;">=3D</span><span class=3D"styled-by-prettify"=
style=3D"color: #000;"> rng</span><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></div></code></div><div><br></div><div>When you have something =
that is conceptually atomic that, by reason of implementation, requires two=
distinct actions,<i> that</i> is when it is appropriate to stick them in o=
ne line.</div><div><br></div><div>Of course, you'll naturally try to sa=
y that getting iterators for two separate ranges is also a single logical t=
hought to your algorithm. But I contest this because they're not atomic=
actions. Getting the beginning of a range is useless without getting its e=
nd (in most cases). That's what makes the pair of actions "atomic&=
quot;; you can't do <i>anything</i> with them until both are complete.<=
/div><div><br></div><div>However, getting one iterator range can be useful =
without getting some other iterator range. It may not be useful to<i> your<=
/i> algorithm, but it is still useful in the general sense.</div><div><br><=
/div><div>That's my personal dividing line.</div><div><i><br></i></div>=
<div><span style=3D"display: inline !important; float: none; background-col=
or: transparent; color: rgb(34, 34, 34); font-family: "Arial",&qu=
ot;Helvetica",sans-serif; font-size: 13px; font-style: normal; font-va=
riant: normal; font-weight: 400; letter-spacing: normal; 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;">On=
Thursday, December 14, 2017 at 7:37:22 AM UTC-5, Richard Hodges wrote:</sp=
an><blockquote class=3D"gmail_quote" style=3D"background-color: transparent=
; border-left-color: rgb(204, 204, 204); border-left-style: solid; border-l=
eft-width: 1px; color: rgb(34, 34, 34); font-family: &quot;Arial&qu=
ot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: =
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; mar=
gin-bottom: 0px; margin-left: 5.38px; margin-right: 0px; margin-top: 0px; o=
rphans: 2; padding-left: 6.73px; 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;"><div style=3D"border-bottom-color: rgb=
(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-i=
mage-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bor=
der-image-source: none; border-image-width: 1; border-left-color: rgb(34, 3=
4, 34); border-left-style: none; border-left-width: 0px; border-right-color=
: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; borde=
r-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px=
; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;=
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0=
px;" dir=3D"ltr">Having pondered the responses, it turns out that I can exp=
ress my algorithm in a tightly scoped, DRY and legal manner in current c++ =
like this:</div></blockquote><div><br></div><div>I'm not really sure wh=
at that proves. You can accomplish the same thing by using curly braces:</d=
iv><div><br></div><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"styled-by-prettify" style=3D"color: #660;">{</span><span class=3D"style=
d-by-prettify" style=3D"color: #000;"><br>=C2=A0 std</span><span class=3D"s=
tyled-by-prettify" style=3D"color: #660;">::</span><span class=3D"styled-by=
-prettify" style=3D"color: #000;">size_t ix </span><span class=3D"styled-by=
-prettify" style=3D"color: #660;">=3D</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=
=3D"color: #066;">0</span><span class=3D"styled-by-prettify" style=3D"color=
: #660;">;</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;"=
>auto</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> firs=
t </span><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</spa=
n><span class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span c=
lass=3D"styled-by-prettify" style=3D"color: #008;">begin</span><span class=
=3D"styled-by-prettify" style=3D"color: #660;">(</span><span class=3D"style=
d-by-prettify" style=3D"color: #000;">v</span><span class=3D"styled-by-pret=
tify" style=3D"color: #660;">);</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;"><br>=C2=A0 </span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #008;">auto</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color=
: #008;">last</span><span class=3D"styled-by-prettify" style=3D"color: #000=
;"> </span><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</s=
pan><span class=3D"styled-by-prettify" style=3D"color: #000;"> </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;">v</span><span class=3D"styled-by-pret=
tify" style=3D"color: #660;">);</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;"><br>=C2=A0 </span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #008;">for</span><span class=3D"styled-by-prettify" style=3D=
"color: #660;">(;</span><span class=3D"styled-by-prettify" style=3D"color: =
#000;"> first </span><span class=3D"styled-by-prettify" style=3D"color: #66=
0;">!=3D</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> <=
/span><span class=3D"styled-by-prettify" style=3D"color: #008;">last</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-p=
rettify" style=3D"color: #000;">first</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #660;">,</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color=
: #660;">++</span><span class=3D"styled-by-prettify" style=3D"color: #000;"=
>ix</span><span class=3D"styled-by-prettify" style=3D"color: #660;">)</span=
><span class=3D"styled-by-prettify" style=3D"color: #000;"><br>=C2=A0 =C2=
=A0 </span><span class=3D"styled-by-prettify" style=3D"color: #800;">//Actu=
al loop body;</span><span class=3D"styled-by-prettify" style=3D"color: #000=
;"><br></span><span class=3D"styled-by-prettify" style=3D"color: #660;">}</=
span></div></code></div><div><br></div><div>You can even remove the `begin`=
line by adding it to the `for` statement. So what's the downside of th=
is? Do you really need to write these multi-variable things<i> that often</=
i> that we need a language change? You've not answered that question.</=
div><div><br></div><blockquote class=3D"gmail_quote" style=3D"background-co=
lor: transparent; border-left-color: rgb(204, 204, 204); border-left-style:=
solid; border-left-width: 1px; color: rgb(34, 34, 34); font-family: &q=
uot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13=
px; font-style: normal; font-variant: normal; font-weight: 400; letter-spac=
ing: normal; margin-bottom: 0px; margin-left: 5.38px; margin-right: 0px; ma=
rgin-top: 0px; orphans: 2; padding-left: 6.73px; 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 style=3D"border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;" dir=3D"ltr"><div style=3D"border-bottom-color: rgb(34,=
34, 34); border-bottom-style: none; 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(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
>I really do think that there is a case for allowing:</div><div style=3D"bo=
rder-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-botto=
m-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(34, 34, 34); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none;=
border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right:=
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;"><div style=3D"border-bottom-color: rgb(34, 34, 3=
4); border-bottom-style: none; border-bottom-width: 0px; border-image-outse=
t: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-=
source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bo=
rder-left-style: none; border-left-width: 0px; border-right-color: rgb(34, =
34, 34); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-b=
ottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-b=
ottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br s=
tyle=3D"background-attachment: scroll; background-clip: border-box; backgro=
und-color: transparent; background-image: none; background-origin: padding-=
box; background-position-x: 0%; background-position-y: 0%; background-repea=
t: repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); bor=
der-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; b=
order-image-repeat: stretch; border-image-slice: 100%; border-image-source:=
none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-le=
ft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34)=
; border-right-style: none; border-right-width: 0px; border-top-color: rgb(=
34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, =
34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quo=
t;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px; margin-le=
ft: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visi=
ble; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px;"></div><div style=3D"bord=
er-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-=
width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-im=
age-slice: 100%; border-image-source: none; border-image-width: 1; border-l=
eft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px=
; border-right-color: rgb(34, 34, 34); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; b=
order-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right:=
0px; padding-top: 0px;"><div style=3D"border-bottom-color: rgb(0, 0, 0); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-lef=
t-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0=
, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); f=
ont-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; ma=
rgin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; =
padding-top: 0px; white-space: pre;"><font face=3D"monospace, monospace" st=
yle=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-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: none; border-r=
ight-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bo=
rder-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px;">=C2=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<spa=
n style=3D"border-bottom-color: rgb(9, 136, 90); border-bottom-style: none;=
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(9, 136, 90); border-left-style: none; border-=
left-width: 0px; border-right-color: rgb(9, 136, 90); border-right-style: n=
one; border-right-width: 0px; border-top-color: rgb(9, 136, 90); border-top=
-style: none; border-top-width: 0px; color: rgb(9, 136, 90); margin-bottom:=
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom:=
0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">0</span>)] =
; auto&& elem : v)</font></div><div style=3D"border-bottom-color: r=
gb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-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: rg=
b(0, 0, 0); border-right-style: none; border-right-width: 0px; border-top-c=
olor: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: r=
gb(0, 0, 0); font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px; white-space: pre;"><div style=3D"border-bot=
tom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0p=
x; 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-rig=
ht-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0=
px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top:=
0px;"><font face=3D"monospace, monospace" style=3D"border-bottom-color: rg=
b(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-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: none; border-right-width: 0px; border-top-co=
lor: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bo=
ttom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bo=
ttom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(elem, </font=
><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: non=
e; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: s=
tretch; border-image-slice: 100%; border-image-source: none; border-image-w=
idth: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none;=
border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style:=
none; border-top-width: 0px; font-family: monospace,monospace; margin-bott=
om: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bott=
om: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">i++)</sp=
an><span style=3D"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; font-family: monospace,monospace; margin-bo=
ttom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bo=
ttom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">;</spa=
n></div><div style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style:=
none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-=
style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;"><span style=3D"border-bottom-color: =
rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-i=
mage-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bor=
der-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: r=
gb(0, 0, 0); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; font-fa=
mily: monospace,monospace; margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0, 0=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: 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: none; border-right-width: 0px; border-top-color: rgb(=
0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></div></=
div></div><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom=
-style: none; border-bottom-width: 0px; border-image-outset: 0; border-imag=
e-repeat: stretch; border-image-slice: 100%; border-image-source: none; bor=
der-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: =
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34=
); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;"><div style=3D"border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;">or:</div><div style=3D"border-bottom-color: rgb(0, 0, =
0); border-bottom-style: none; border-bottom-width: 0px; border-image-outse=
t: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-=
source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); borde=
r-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, =
0); font-size: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px; white-space: pre;"><font face=3D"monospace, monospac=
e" style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; b=
order-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stret=
ch; 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: none; bor=
der-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: non=
e; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0, 0)=
; border-bottom-style: none; border-bottom-width: 0px; border-image-outset:=
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-so=
urce: 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: none; border-right-width: 0px; border-top-color: rgb(0=
, 0, 0); border-top-style: none; border-top-width: 0px; margin-bottom: 0px;=
margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px;=
padding-left: 0px; padding-right: 0px; padding-top: 0px;"></font></div><di=
v style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; bo=
rder-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretc=
h; 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-w=
idth: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; bord=
er-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none=
; border-top-width: 0px; color: rgb(0, 0, 0); font-size: 14px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; white-spac=
e: pre;"><font face=3D"monospace, monospace" style=3D"border-bottom-color: =
rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-i=
mage-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bor=
der-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: r=
gb(0, 0, 0); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-=
bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-=
bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=
=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<span style=3D"border-bottom-co=
lor: rgb(9, 136, 90); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(9, 136, 90); border-left-style: none; border-left-width: 0px; border-rig=
ht-color: rgb(9, 136, 90); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(9, 136, 90); border-top-style: none; border-top-wi=
dth: 0px; color: rgb(9, 136, 90); margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pa=
dding-right: 0px; padding-top: 0px;">0</span>), first =3D begin(v), last =
=3D end(v)] ; first !=3D last ; ++first, ++i)</font></div><div style=3D"bor=
der-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-w=
idth: 0px; color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 0px; margin=
-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddin=
g-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre;"><div =
style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; bord=
er-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-wid=
th: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; =
border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right=
: 0px; padding-top: 0px;"><font face=3D"monospace, monospace" style=3D"bord=
er-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-wid=
th: 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; bord=
er-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width:=
0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-wi=
dth: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0 f(*first, </font><span style=3D"border-bottom-color: rgb(0, 0, 0); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-lef=
t-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0=
, 0); border-top-style: none; border-top-width: 0px; font-family: monospace=
,monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;">i)</span><span style=3D"border-bottom-color: rgb(0, 0, 0); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-lef=
t-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0=
, 0); border-top-style: none; border-top-width: 0px; font-family: monospace=
,monospace; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;">;</span></div><div style=3D"border-bottom-color: rgb(0, 0, 0=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: 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: none; border-right-width: 0px; border-top-color: rgb(=
0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span style=3D"=
border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-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: none; border-right-wi=
dth: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-to=
p-width: 0px; font-family: monospace,monospace; margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px;"><br style=3D"border-bott=
om-color: rgb(0, 0, 0); border-bottom-style: none; 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-righ=
t-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0p=
x; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px;"></span></div></div></div><div style=3D"border-bottom-color: rgb(34, 3=
4, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-o=
utset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-im=
age-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
34, 34, 34); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; marg=
in-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><=
div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: non=
e; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: s=
tretch; border-image-slice: 100%; border-image-source: none; border-image-w=
idth: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; borde=
r-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style:=
none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-t=
op-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px;"><div style=3D"border-bottom-color=
: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bor=
der-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%=
; border-image-source: none; border-image-width: 1; border-left-color: rgb(=
34, 34, 34); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width=
: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px;">or:</div><div style=3D"border-bottom-color: rgb(0, 0, 0); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); =
border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); font-si=
ze: 14px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px; white-space: pre;"><font face=3D"monospace, monospace" style=3D=
"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-botto=
m-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: none; border-right-w=
idth: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-t=
op-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; mar=
gin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0, 0); border-bo=
ttom-style: none; 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-rig=
ht-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); bo=
rder-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;"></font></div><div style=3D"=
border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-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: none; border-right-wi=
dth: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-to=
p-width: 0px; color: rgb(0, 0, 0); font-size: 14px; margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px; white-space: pre;"><f=
ont face=3D"monospace, monospace" style=3D"border-bottom-color: rgb(0, 0, 0=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: 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: none; border-right-width: 0px; border-top-color: rgb(=
0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0=C2=A0=C2=
=A0 for(auto i =3D std::size_t(<span style=3D"border-bottom-color: rgb(9, 1=
36, 90); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(9, 136, 90=
); border-left-style: none; border-left-width: 0px; border-right-color: rgb=
(9, 136, 90); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(9, 136, 90); border-top-style: none; border-top-width: 0px; col=
or: rgb(9, 136, 90); margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px;">0</span>), first =3D begin(v), last =3D end(v) ; fi=
rst !=3D last ; ++first, ++i)</font></div><div style=3D"border-bottom-color=
: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-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: none; border-right-width: 0px; border-to=
p-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color=
: rgb(0, 0, 0); font-size: 14px; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px; white-space: pre;"><div style=3D"border-=
bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width:=
0px; border-image-outset: 0; border-image-repeat: stretch; border-image-sl=
ice: 100%; border-image-source: none; border-image-width: 1; border-left-co=
lor: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; border-=
right-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width=
: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px;"><font face=3D"monospace, monospace" style=3D"border-bottom-color:=
rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-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: none; border-right-width: 0px; border-top=
-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding=
-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, <=
/font><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style=
: none; border-bottom-width: 0px; border-image-outset: 0; border-image-repe=
at: stretch; border-image-slice: 100%; border-image-source: none; border-im=
age-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; bor=
der-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-s=
tyle: none; border-top-width: 0px; font-family: monospace,monospace; margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding=
-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">i)<=
/span><span style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style=
: none; border-bottom-width: 0px; border-image-outset: 0; border-image-repe=
at: stretch; border-image-slice: 100%; border-image-source: none; border-im=
age-width: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; bor=
der-left-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-s=
tyle: none; border-top-width: 0px; font-family: monospace,monospace; margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding=
-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">;</=
span></div><div style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-s=
tyle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-=
repeat: stretch; border-image-slice: 100%; border-image-source: none; borde=
r-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-sty=
le: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-t=
op-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px;"><span style=3D"border-bottom-colo=
r: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; borde=
r-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: none; border-right-width: 0px; border-t=
op-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; font=
-family: monospace,monospace; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0=
, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-out=
set: 0; border-image-repeat: stretch; border-image-slice: 100%; border-imag=
e-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); bor=
der-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0,=
0); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bottom: =
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: =
0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></div=
></div></div></div><div style=3D"border-bottom-color: rgb(34, 34, 34); bord=
er-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bo=
rder-image-repeat: stretch; border-image-slice: 100%; border-image-source: =
none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-lef=
t-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34);=
border-right-style: none; border-right-width: 0px; border-top-color: rgb(3=
4, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div style=3D=
"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bo=
ttom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bord=
er-image-slice: 100%; border-image-source: none; border-image-width: 1; bor=
der-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width=
: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: no=
ne; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px;">since we already have this ability in the nas=
ty lambda above, why not provide the ability in a way that's easy to re=
ason about?</div></div></div></div></blockquote><div><br></div><div>You can=
already do the first one; just get rid of the structured binding bit. And =
the second and third ones have nothing to do with one another. They have co=
mpletely different semantics.</div></div><blockquote class=3D"gmail_quote" =
style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-l=
eft: 1ex;">
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/79fdf8b2-08e8-4889-a1b6-50f0f05eb0d0%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/79fdf8b2-08e8-4889-a1b6-50f0f05eb0d0=
%40isocpp.org</a>.<br />
------=_Part_3298_581109901.1513271987543--
------=_Part_3297_526296050.1513271987541--
.
Author: Richard Hodges <hodges.r@gmail.com>
Date: Thu, 14 Dec 2017 19:20:08 +0100
Raw View
--001a114aad7824753b056050efdd
Content-Type: text/plain; charset="UTF-8"
On 14 December 2017 at 18:19, Nicol Bolas <jmckesson@gmail.com> wrote:
> On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:
>>
>> I won't dwell too much, just a couple of comments:
>> On 14 December 2017 at 00:48, Nicol Bolas <jmck...@gmail.com> wrote:
>>
>>> On Wednesday, December 13, 2017 at 5:22:11 PM UTC-5, Richard Hodges
>>> wrote:
>>>>
>>>> inline....
>>>>
>>>> On 13 December 2017 at 18:05, Nicol Bolas <*jmck...@gmail.com*> wrote:
>>>>
>>>>> On Wednesday, December 13, 2017 at 10:58:11 AM UTC-5, Richard Hodges
>>>>> wrote:
>>>>>
>>>> Either support it in the core language or don't. The current half and
>>>> half approach is an error. why shouldn't I be able to say:
>>>>
>>>> auto t = auto [x = int(1), y = std::string("foo"), 6]; // get<0>(t) ==
>>>> 1, get<1>(t) == "foo", get<2>(t) == 6
>>>>
>>>> such an expression is expressive, succinct and useful. I can manipulate
>>>> the tuple either as a complete object or as individual objects. Great!
>>>>
>>>
>>> I fail to see how that is an improvement over using a tuple. And quite
>>> frankly, we already have ways of declaring a type:
>>>
>>> struct {int x = 1; std::string y{"foo"}; int z = 6;} t;
>>>
>>>
>> Declaring an object of on-the-fly struct would be a solution if a
>> struct's members could be declared auto.
>>
>
> Seriously, what is it with people and `auto`? Why are you so allergic to
> typenames? That structure as it stands is far more readable than the "auto"
> version would be.
>
spelling out typenames makes template programming hard and verbose. This is
why auto was introduced, as you well know.
>
> Thinking like this makes me rue the day the committee ever standardized
> `auto` variable deduction. People keep trying to take a useful tool for
> dealing with obvious code and long typenames, and turning it into the thing
> that must be used everywhere.
>
People find their own uses for language features. auto is incredibly useful
for a number of reasons. less verbosity, more succinct statement of
abstract intent, easier refactoring, etc.
>
> Let's not standardize the Almost-Always-Auto ideology.
>
Too late. Having to spell out typenames is primitive and vile, because
intent gets lost amongst the irrelevant noise of long type names. A
language ought to be both correct and enjoyable to use. auto helps very
much in both regards. If you really are not using auto, it could be because
you don't have to deliver correct solutions in a timely manner any more.
auto has massively increased our productivity.
>
> Unhappily they cannot, so this solution would only work where types are
>> well known. Of course the argument for introducing auto hinged on
>> convenience of type deduction, particularly in template expansions. This is
>> a convenience I think we all enjoy. I would like to see this kind of
>> convenience extended.
>>
>
> "Convenience" of this sort often creates ambiguity and confusion. Having
> to use a typename is not some kind of onerous burden here.
>
I disagree. "convenience" is almost always synonymous with "easier to
correctly maintain and reason about". The more naturally we can express
ideas in code, the easier time code-maintainers will have in understanding
the original author's intent. Intent is a human concept, a computer merely
blindly follows orders. The more intent-like code is expressed, the more
likely it is to be correct.
>
> As a side note, there is exactly one core language feature in which the
>> types of members is automatically deduced - the lambda with capture. The
>> automatic deduction is useful in this case, it might well be in others.
>>
>
> That's because lambdas have to be short to be useful, particularly the
> capture list. The main point of a lambda is not what it captures but the
> actual function it encapsulates. The capture part is an unfortunate
> implementation detail that we try to minimize where possible.
>
> That is, the point of a lambda is the function part, not the functor part.
> The functor part is an implementation detail required by the way C++ works.
>
A lambda is logically equivalent to a tuple/struct that happens to have a
call operator. Lambdas are as much a code-writing service as templates are.
std::tuple is a code-writing service too. Lambda notation is a low-noise
solution for creation first class function objects. There's logically no
reason at all that auto a = [ x=foo(), y = bar(), &rest... ] can't be a
low-noise solution for creating on-the-fly composite objects with easy
member visibility. The intent is easily clear to any reader, and it
replaces this abomination:
auto [ x, y /* what now? */ ] = std::tuple(foo(), bar(), std::ref(rest)...);
// ^ ugh - this is so
un-necessary!
>
> Making struct definitions shorter makes them harder to reason about and
> digest, and gives precious little back in return.
>
> No, it's best to just leave things as they are. In those circumstances
>>>>> where it is necessary to achieve what you want, you can still do it. But
>>>>> the poor syntax and copying behavior will encourage you to avoid it
>>>>> whenever possible.
>>>>>
>>>>
>>>> An "it's best to leave things as they are" attitude would leave us with
>>>> c+98 and prevent c++ ever becoming a mature fully-featured expressive
>>>> language. I'm afraid to say that I cannot take this statement seriously.
>>>>
>>>
>>> I didn't say we should leave all of C++ as it is. I'm saying that we
>>> should leave *this* as it is.
>>>
>>> My problems with this really boil down to (in priority order):
>>>
>>> 1) It abuses structured binding, forcing it to do something that
>>> structured binding isn't meant to do simply because it is convenient syntax.
>>>
>>
>> Tuples and structures are _logically_ two flavours of the same thing. We
>> happen to talk about them as if they are different for historic reasons,
>> not logical ones.
>>
>
> ... I don't know what that has to do with what I said. Your statement only
> makes sense if you think of structured binding as a feature invented for
> tuples. It's not. It works just fine with decomposeable structs, and you
> can write machinery to make them decomposeable when they're not
> automatically decomposeable.
>
> For me, the ability to spontaneously create an object of an arbitrary
>> compound type, and inject the names of its members into local scope seems
>> useful. It is this feature that gives python (for example) its wonderfully
>> succinct list-comprehension syntax.
>>
>
> That doesn't justify abusing structured binding to do that. If you really
> believe that the ability to create a type and make local variables of its
> members is useful (and I've yet to see how), then you should create a
> feature that is specifically about that.
>
> Structured binding is about unpacking an existing object, not about
> creating types. Don't abuse a syntax for an unrelated feature just because
> it's convenient.
>
> 2) The problems this solves are not encountered frequently enough to
>>> override #1.
>>>
>>
>> Assertion. New tools create new opportunities.
>>
>
> Also an assertion. What "new opportunities" does this create?
>
How do we know, until we start thinking in terms of opportunity, rather
than in terms of squashing ideas from the user base?
>
> 3) In a lot of the practical cases where this might be useful, there are
>>> better solutions that don't need it (like my range adaptor example).
>>>
>>
>> Building a new iterator type for every logical scenario is inconvenient
>> and difficult to teach. It hides logic details.
>>
>
> Hiding details for complex iteration scenarios is exactly what you* ought*
> to do. Show me the code using a non-range adaptor that iterates over two
> ranges, accessing the value from each range. Feel free to use whatever
> `auto` syntax you want to initialize multiple variables. But you're not
> allowed to use a standard library algorithm.
>
> Now compare that `for` loop to the range adapter version:
>
> for(auto &[first, second] : zip_range(rng_first, rng_second))
> {}
>
> There's no contest here. Hiding the "logical details" makes this code*
> far* more convenient and easier to teach. The same goes for so many
> iteration scenarios. Iterating over a group of ranges in sequence.
> Iterating over each range in turn. And so on.
>
> The more iteration variables you see in a loop declaration, the more
> iterator expressions it has, the harder it is to follow the logic. Those
> ranges are idiomatic and easily comprehensible.
>
> There will* always* be corner cases, one-off iteration scenarios where
> existing tools don't quite match what you need. But those are* corner
> cases*; we don't build language features just for corner cases.
>
> If a "logical scenario" is frequently encountered, and it fits into the
> range paradigm, then making a range type for it is precisely what one ought
> to do.
>
> This is why range-based-for was invented. "keep simple things simple".'
>>
>
> And the point of range adaptors is to do precisely that. Iterating over a
> pair of range or a sequence of ranges ought to be a simple thing. And with
> range adaptors, they are.
>
> With your idea, it makes them difficult to work with.
>
> Remember: what you want* is not structured bindings*. Structured binding
>>>>> is about unpacking objects that store data into multiple variable-like
>>>>> constructs. You don't have such a object, and you don't really want one.
>>>>> The only reason you created a tuple of values was because structured
>>>>> binding *requires* it.
>>>>>
>>>>> What you really want is the ability to declare multiple variables of
>>>>> different types in a single declaration statement. When `auto` was being
>>>>> standardized, there was discussion about allowing precisely that:
>>>>>
>>>>> auto x = 5.0f, y = 10, z = std::string("foo");
>>>>>
>>>>> These would deduce 3 different types for the 3 variables. The
>>>>> committee specifically decided* against* doing this.
>>>>>
>>>>
>>>> Deciding against this seems to me to have been, in hindsight, the wrong
>>>> decision. Perhaps this error can be corrected in a future standard?
>>>>
>>>
>>> Well, changing it is possible. At present, [dcl.spec.auto]/7 says:
>>>
>>> > The type of each declared variable is determined by placeholder type
>>> deduction (10.1.7.4.1), and if the type that replaces the placeholder type
>>> is not the same in each deduction, the program is ill-formed.
>>>
>>> This means that every declaration which would deduce different types is
>>> at present illegal. So removing this restriction would not break any
>>> currently legal code.
>>>
>>> And this change would be a *lot* more palatable than (ab)using
>>> structured binding for this purpose. It would also have semantics that are
>>> more immediately obvious than those for (ab)using structured binding in
>>> this way.
>>>
>>> Though personally, I still think it's a bad idea.
>>>
>>
>> Do you mind explaining why? Because to me it seems like a splendid idea.
>> To me, auto x = foo(), y = bar(); seems succinct and neat. Someone who
>> didn't know the language would read this and naturally conclude that x and
>> y may be of different types.
>>
>
> I don't like it precisely *because* it encourages you to type `auto x =
> foo(), y = bar();`. Those are two independent operations; two separate
> components of whatever algorithm you're writing. Unless there is some
> obvious connection between `foo` and `bar`, they have no business being on
> the same line.
>
> It's bad coding style, and it ought to fail code review.
>
Then we are at opposite ends of the spectrum here. I do not agree that
"succinct expression of abstract intent" equals "bad coding style".
> I have yet to see a reasonable rationalisation (in the light of
>>> since-gathered experience) of this decision.
>>>
>>> It's you who have to come up with a rationalization *for* the change,
>>> not the other way around. If "the light of since-gathered experience"
>>> really is on your side, you ought to be able to look at all of the old
>>> arguments against it and answer them one-by-one based on that experience.
>>>
>>
>> For one, it's more naturally logical to imagine that an auto variable
>> will have the type of its initialiser.
>>
>
> That's not an answer to those arguments. Indeed, you didn't even state
> what those arguments are.
>
> Be sure to bring up the Range TS Iterator/Sentinel paradigm. That's
>>> *always* a slam-dunk when it comes to deducing the same type ;)
>>>
>>
>> I'm not sure what you mean here. In any range-based algorithm you will
>> certainly want the ability for the iterator to be of a different type to
>> the sentinel. multi-typed auto would help this.
>>
>
> ... right. Which is why I said you* should* bring it up. I wasn't being
> sarcastic.
>
> Consider what I just said about having two "independent operations" on the
> same line. If you're extracting begin/end from a range, then those*
> aren't* "two independent operations". They're a single logical thought:
>
> auto beg = rng.begin(), end = rng.end();
>
> When you have something that is conceptually atomic that, by reason of
> implementation, requires two distinct actions,* that* is when it is
> appropriate to stick them in one line.
>
I think we agree here. Acquiring an index counter and the limits of a range
seem to me to be part of the same logical atomic operation.
>
> Of course, you'll naturally try to say that getting iterators for two
> separate ranges is also a single logical thought to your algorithm. But I
> contest this because they're not atomic actions. Getting the beginning of a
> range is useless without getting its end (in most cases). That's what makes
> the pair of actions "atomic"; you can't do *anything* with them until
> both are complete.
>
I wholeheartedly disagree. The c++ memory model mandates that getting the
two pairs of iterators is indeed atomic. Everything between two memory
fences is logically atomic. This is the foundation of the as-if rule. This
is unarguable.
>
> However, getting one iterator range can be useful without getting some
> other iterator range. It may not be useful to* your* algorithm, but it is
> still useful in the general sense.
>
Agree.
> That's my personal dividing line.
>
With the greatest respect, I cannot allow your personal opinions alone to
hold back useful evolutions of the language. The fact that you are against
the use of auto is very alarming to me.
>
> On Thursday, December 14, 2017 at 7:37:22 AM UTC-5, Richard Hodges wrote:
>>
>> Having pondered the responses, it turns out that I can express my
>> algorithm in a tightly scoped, DRY and legal manner in current c++ like
>> this:
>>
>
> I'm not really sure what that proves. You can accomplish the same thing by
> using curly braces:
>
> {
> std::size_t ix = 0;
> auto first = begin(v);
> auto last = end(v);
> for(; first != last; ++first, ++ix)
> //Actual loop body;
> }
>
> You can even remove the `begin` line by adding it to the `for` statement.
> So what's the downside of this? Do you really need to write these
> multi-variable things* that often* that we need a language change? You've
> not answered that question.
>
That's a fair question. My initial response is that the extra curly braces
are not beautiful. And to me elegance and beauty of code presentation is a
factor in my enjoyment of writing it. To me, that's enough of a reason for
a change (if not the one I originally proposed). I appreciate that you may
not take aesthetics to heart as much as me.
>
> I really do think that there is a case for allowing:
>>
>> for(auto [i = std::size_t(0)] ; auto&& elem : v)
>> f(elem, i++);
>>
>> or:
>>
>> for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ;
>> first != last ; ++first, ++i)
>> f(*first, i);
>>
>> or:
>>
>> for(auto i = std::size_t(0), first = begin(v), last = end(v) ; first
>> != last ; ++first, ++i)
>> f(*first, i);
>>
>> since we already have this ability in the nasty lambda above, why not
>> provide the ability in a way that's easy to reason about?
>>
>
> You can already do the first one; just get rid of the structured binding
> bit. And the second and third ones have nothing to do with one another.
> They have completely different semantics.
>
>> --
> 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/79fdf8b2-08e8-4889-
> a1b6-50f0f05eb0d0%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/79fdf8b2-08e8-4889-a1b6-50f0f05eb0d0%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CALvx3hb3-D%3D1y9NzwomcG7rhF_5bHuj3VTvOjD3Pe_gLCZGOvA%40mail.gmail.com.
--001a114aad7824753b056050efdd
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On 14 December 2017 at 18:19, Nicol Bolas <span dir=3D"ltr"><<a href=
=3D"mailto:jmckesson@gmail.com" target=3D"_blank">jmckesson@gmail.com</a>&g=
t;</span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0px 0=
px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div =
dir=3D"ltr"><span class=3D"gmail-">On Thursday, December 14, 2017 at 2:27:3=
9 AM UTC-5, Richard Hodges wrote:</span><blockquote class=3D"gmail_quote" s=
tyle=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);pad=
ding-left:1ex"><div dir=3D"ltr"><span class=3D"gmail-">I won't dwell to=
o much, just a couple of comments:<br></span><div><div class=3D"gmail_quote=
"><span class=3D"gmail-">On 14 December 2017 at 00:48, Nicol Bolas <span di=
r=3D"ltr"><<a rel=3D"nofollow">jmck...@gmail.com</a>></span> wrote:<b=
r></span><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8e=
x;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"=
><span class=3D"gmail-"><span>On Wednesday, December 13, 2017 at 5:22:11 PM=
UTC-5, Richard Hodges wrote:</span><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex"><div dir=3D"ltr">inline....<br><div><div><br><div class=3D"gmail=
_quote"><span>On 13 December 2017 at 18:05, Nicol Bolas <span dir=3D"ltr">&=
lt;<a rel=3D"nofollow"><u><font color=3D"#0066cc">jmck...@gmail.com</font><=
/u></a>></span> wrote:<br></span><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex"><div dir=3D"ltr"><span><span>On Wednesday, December 13, 2017 at =
10:58:11 AM UTC-5, Richard Hodges wrote:</span></span><span>=C2=A0</span></=
div></blockquote></div></div></div></div></blockquote></span><span class=3D=
"gmail-"><span><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0p=
x 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=
=3D"ltr"><div><div><div class=3D"gmail_quote"><div>Either support it in the=
core language or don't. The current half and half approach is an error=
.. why shouldn't I be able to say:</div><div><br></div><div><span style=
=3D"font-family:monospace,monospace">auto t =3D auto [x =3D int(1), y =3D s=
td::string("foo"), 6];=C2=A0 // get<0>(t) =3D=3D 1, get<=
1>(t) =3D=3D "foo", get<2>(t) =3D=3D 6<br></span></div><=
div>=C2=A0 <br></div><div>such
an expression is expressive, succinct and useful. I can manipulate the=20
tuple either as a complete object or as individual objects. Great!</div></d=
iv></div></div></div></blockquote><div><br></div></span><div>I fail to see =
how that is an improvement over using a tuple. And quite frankly, we alread=
y have ways of declaring a type:</div><div><br></div><div style=3D"backgrou=
nd-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;=
border-width:1px"><code><div><span style=3D"color:rgb(0,0,136)">struct</spa=
n><span style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(102,102=
,0)">{</span><span style=3D"color:rgb(0,0,136)">int</span><span style=3D"co=
lor:rgb(0,0,0)"> x </span><span style=3D"color:rgb(102,102,0)">=3D</span><s=
pan style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,102,102)"=
>1</span><span style=3D"color:rgb(102,102,0)">;</span><span style=3D"color:=
rgb(0,0,0)"> std</span><span style=3D"color:rgb(102,102,0)">::</span><span =
style=3D"color:rgb(0,0,136)">string</span><span style=3D"color:rgb(0,0,0)">=
y</span><span style=3D"color:rgb(102,102,0)">{</span><span style=3D"color:=
rgb(0,136,0)">"foo"</span><span style=3D"color:rgb(102,102,0)">};=
</span><span style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,=
0,136)">int</span><span style=3D"color:rgb(0,0,0)"> z </span><span style=3D=
"color:rgb(102,102,0)">=3D</span><span style=3D"color:rgb(0,0,0)"> </span><=
span style=3D"color:rgb(0,102,102)">6</span><span style=3D"color:rgb(102,10=
2,0)">;}</span><span style=3D"color:rgb(0,0,0)"> t</span><span style=3D"col=
or:rgb(102,102,0)">;</span></div></code></div><div><br></div></span></div><=
/blockquote><span class=3D"gmail-"><div><br></div><div>Declaring an object =
of on-the-fly struct would be a solution if a struct's members could be=
declared auto.</div></span></div></div></div></blockquote><div><br></div><=
div>Seriously, what is it with people and `auto`? Why are you so allergic t=
o typenames? That structure as it stands is far more readable than the &quo=
t;auto" version would be.</div></div></blockquote><div><br></div><div>=
spelling out typenames makes template programming hard and verbose. This is=
why auto was introduced, as you well know.</div><div>=C2=A0</div><blockquo=
te class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px =
solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div><br></div><d=
iv>Thinking like this makes me rue the day the committee ever standardized =
`auto` variable deduction. People keep trying to take a useful tool for dea=
ling with obvious code and long typenames, and turning it into the thing th=
at must be used everywhere.</div></div></blockquote><div><br></div><div>Peo=
ple find their own uses for language features. auto is incredibly useful fo=
r a number of reasons. less verbosity, more succinct statement of abstract =
intent, easier refactoring, etc.</div><div>=C2=A0</div><blockquote class=3D=
"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(2=
04,204,204);padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Let'=
s not standardize the Almost-Always-Auto ideology.</div></div></blockquote>=
<div><br></div><div>Too late. Having to spell out typenames is primitive an=
d vile, because intent gets lost amongst the irrelevant noise of long type =
names. A language ought to be both correct and enjoyable to use. auto helps=
very much in both regards. If you really are not using auto, it could be b=
ecause you don't have to deliver correct solutions in a timely manner a=
ny more. auto has massively increased our productivity.</div><div>=C2=A0</d=
iv><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bord=
er-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><span=
class=3D"gmail-"><div><br></div><blockquote class=3D"gmail_quote" style=3D=
"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-le=
ft:1ex"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><div>Unhappily the=
y cannot, so this solution would only work where types are well known. Of c=
ourse the argument for introducing auto hinged on convenience of type deduc=
tion, particularly in template expansions. This is a convenience I think we=
all enjoy. I would like to see this kind of convenience extended.</div></d=
iv></div></div></blockquote><div><br></div></span><div>"Convenience&qu=
ot; of this sort often creates ambiguity and confusion. Having to use a typ=
ename is not some kind of onerous burden here.</div></div></blockquote><div=
><br></div><div>I disagree. "convenience" is almost always synony=
mous with "easier to correctly maintain and reason about". The mo=
re naturally we can express ideas in code, the easier time code-maintainers=
will have in understanding the original author's intent. Intent is a h=
uman concept, a computer merely blindly follows orders. The more intent-lik=
e code is expressed, the more likely it is to be correct.=C2=A0</div><div>=
=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
..8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"l=
tr"><span class=3D"gmail-"><div><br></div><blockquote class=3D"gmail_quote"=
style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);p=
adding-left:1ex"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><div>As a=
side note, there is exactly one core language feature in which the types o=
f members is automatically deduced - the lambda with capture. The automatic=
deduction is useful in this case, it might well be in others.<br></div></d=
iv></div></div></blockquote><div><br></div></span><div>That's because l=
ambdas have to be short to be useful, particularly the capture list. The ma=
in point of a lambda is not what it captures but the actual function it enc=
apsulates. The capture part is an unfortunate implementation detail that we=
try to minimize where possible.</div><div><br></div><div>That is, the poin=
t of a lambda is the function part, not the functor part. The functor part =
is an implementation detail required by the way C++ works.</div></div></blo=
ckquote><div><br></div><div>A lambda is logically equivalent to a tuple/str=
uct that happens to have a call operator. Lambdas are as much a code-writin=
g service as templates are. <font face=3D"monospace, monospace">std::tuple<=
/font> is a code-writing service too. Lambda notation is a low-noise soluti=
on for creation first class function objects. There's logically no reas=
on at all that <font face=3D"monospace, monospace" style=3D"background-colo=
r:rgb(204,204,204)">auto a =3D=C2=A0[ x=3Dfoo(), y =3D bar(), &rest... =
]</font> can't be a low-noise solution for creating on-the-fly composit=
e objects with easy member visibility.=C2=A0 The intent is easily clear to =
any reader, and it replaces this abomination:</div><div><br></div><div><fon=
t face=3D"monospace, monospace">auto [ x, y /* what now? */ ] =3D std::tupl=
e(foo(), bar(), std::ref(rest)...);</font></div><div><font face=3D"monospac=
e, monospace">//=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0^ ugh - this =
is so un-necessary!</font></div><div><br></div><div><br></div><div>=C2=A0</=
div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bor=
der-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div=
><br></div><div>Making struct definitions shorter makes them harder to reas=
on about and digest, and gives precious little back in return.</div><span c=
lass=3D"gmail-"><div><span><br></span></div><blockquote class=3D"gmail_quot=
e" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204)=
;padding-left:1ex"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><blockq=
uote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1p=
x solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><span><blockquo=
te class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px =
solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div><div><div cl=
ass=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0=
px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div =
dir=3D"ltr"><div>No,
it's best to just leave things as they are. In those circumstances=20
where it is necessary to achieve what you want, you can still do it. But
the poor syntax and copying behavior will encourage you to avoid it=20
whenever possible.</div></div></blockquote><div><br></div><div>An "it&=
#39;s=20
best to leave things as they are" attitude would leave us with c+98 an=
d=20
prevent c++ ever becoming a mature fully-featured expressive language.=20
I'm afraid to say that I cannot take this statement seriously.<br></div=
></div></div></div></div></blockquote><div><br></div></span><div>I didn'=
;t say we should leave all of C++ as it is. I'm saying that we should l=
eave <i>this</i> as it is.</div><div><br></div><div>My problems with this r=
eally boil down to (in priority order):</div><div><br></div><div>1) It abus=
es structured binding, forcing it to do something that structured binding i=
sn't meant to do simply because it is convenient syntax.</div></div></b=
lockquote><div><br></div>Tuples and structures are _logically_ two flavours=
of the same thing. We happen to talk about them as if they are different f=
or historic reasons, not logical ones.</div></div></div></blockquote><div><=
br></div></span><div>... I don't know what that has to do with what I s=
aid. Your statement only makes sense if you think of structured binding as =
a feature invented for tuples. It's not. It works just fine with decomp=
oseable structs, and you can write machinery to make them decomposeable whe=
n they're not automatically decomposeable.</div><span class=3D"gmail-">=
<div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0p=
x 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=
=3D"ltr"><div><div class=3D"gmail_quote">For me, the ability to spontaneous=
ly create an object of an arbitrary compound type, and inject the names of =
its members into local scope seems useful. It is this feature that gives py=
thon (for example) its wonderfully succinct list-comprehension syntax.<br><=
/div></div></div></blockquote><div><br></div></span><div>That doesn't j=
ustify abusing structured binding to do that. If you really believe that th=
e ability to create a type and make local variables of its members is usefu=
l (and I've yet to see how), then you should create a feature that is s=
pecifically about that.=C2=A0</div></div></blockquote><blockquote class=3D"=
gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(20=
4,204,204);padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Structure=
d binding is about unpacking an existing object, not about creating types. =
Don't abuse a syntax for an unrelated feature just because it's con=
venient.</div><span class=3D"gmail-"><div><br></div><blockquote class=3D"gm=
ail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,=
204,204);padding-left:1ex"><div dir=3D"ltr"><div><div class=3D"gmail_quote"=
></div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex"><div dir=3D"ltr"><div>2) The problems this solves are not encoun=
tered frequently enough to override #1.</div></div></blockquote><div><br></=
div><div>Assertion. New tools create new opportunities.<br></div></div></di=
v></div></blockquote><div><br></div></span><div>Also an assertion. What &qu=
ot;new opportunities" does this create?</div></div></blockquote><div><=
br></div><div>How do we know, until we start thinking in terms of opportuni=
ty, rather than in terms of squashing ideas from the user base?</div><div>=
=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0=
..8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"l=
tr"><span class=3D"gmail-"><div><br></div><blockquote class=3D"gmail_quote"=
style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);p=
adding-left:1ex"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><blockquo=
te class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px =
solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div>3) In a lot =
of the practical cases where this might be useful, there are better solutio=
ns that don't need it (like my range adaptor example).</div></div></blo=
ckquote><div><br></div><div>Building a new iterator type for every logical =
scenario is inconvenient and difficult to teach. It hides logic details.</d=
iv></div></div></div></blockquote><div><br></div></span><div>Hiding details=
for complex iteration scenarios is exactly what you<i> ought</i> to do. Sh=
ow me the code using a non-range adaptor that iterates over two ranges, acc=
essing the value from each range. Feel free to use whatever `auto` syntax y=
ou want to initialize multiple variables. But you're not allowed to use=
a standard library algorithm.</div><div><br></div><div>Now compare that `f=
or` loop to the range adapter version:</div><div><br></div><div class=3D"gm=
ail-m_2617265813871618012prettyprint" style=3D"border:1px solid rgb(187,187=
,187);word-wrap:break-word;background-color:rgb(250,250,250)"><code class=
=3D"gmail-m_2617265813871618012prettyprint"><div class=3D"gmail-m_261726581=
3871618012subprettyprint"><span class=3D"gmail-m_2617265813871618012styled-=
by-prettify" style=3D"color:rgb(0,0,136)">for</span><span class=3D"gmail-m_=
2617265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">(</sp=
an><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"c=
olor:rgb(0,0,136)">auto</span><span class=3D"gmail-m_2617265813871618012sty=
led-by-prettify" style=3D"color:rgb(0,0,0)"> </span><span class=3D"gmail-m_=
2617265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">&=
[</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=
=3D"color:rgb(0,0,0)">first</span><span class=3D"gmail-m_261726581387161801=
2styled-by-prettify" style=3D"color:rgb(102,102,0)">,</span><span class=3D"=
gmail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)"> =
second</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" =
style=3D"color:rgb(102,102,0)">]</span><span class=3D"gmail-m_2617265813871=
618012styled-by-prettify" style=3D"color:rgb(0,0,0)"> </span><span class=3D=
"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(102,102,=
0)">:</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" s=
tyle=3D"color:rgb(0,0,0)"> zip_range</span><span class=3D"gmail-m_261726581=
3871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">(</span><span =
class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(=
0,0,0)">rng_first</span><span class=3D"gmail-m_2617265813871618012styled-by=
-prettify" style=3D"color:rgb(102,102,0)">,</span><span class=3D"gmail-m_26=
17265813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)"> rng_second=
</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=
=3D"color:rgb(102,102,0)">))</span><span class=3D"gmail-m_26172658138716180=
12styled-by-prettify" style=3D"color:rgb(0,0,0)"><br></span><span class=3D"=
gmail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0=
)">{}</span></div></code></div><div><br></div><div>There's no contest h=
ere. Hiding the "logical details" makes this code<i> far</i> more=
convenient and easier to teach. The same goes for so many iteration scenar=
ios. Iterating over a group of ranges in sequence. Iterating over each rang=
e in turn. And so on.</div><div><br></div><div>The more iteration variables=
you see in a loop declaration, the more iterator expressions it has, the h=
arder it is to follow the logic. Those ranges are idiomatic and easily comp=
rehensible.</div><div><br></div><div>There will<i> always</i> be corner cas=
es, one-off iteration scenarios where existing tools don't quite match =
what you need. But those are<i> corner cases</i>; we don't build langua=
ge features just for corner cases.</div><div><br></div><div>If a "logi=
cal scenario" is frequently encountered, and it fits into the range pa=
radigm, then making a range type for it is precisely what one ought to do.<=
/div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0=
px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div =
dir=3D"ltr"><div><div class=3D"gmail_quote"><div>This is why range-based-fo=
r was invented. "keep simple things simple".'<br></div></div>=
</div></div></blockquote><div><br></div><div>And the point of range adaptor=
s is to do precisely that. Iterating over a pair of range or a sequence of =
ranges ought to be a simple thing. And with range adaptors, they are.</div>=
<div><br></div><div>With your idea, it makes them difficult to work with.</=
div><span class=3D"gmail-"><div><span><br></span></div><blockquote class=3D=
"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(2=
04,204,204);padding-left:1ex"><div dir=3D"ltr"><div><div class=3D"gmail_quo=
te"><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bor=
der-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><spa=
n><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;borde=
r-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div><=
div><div class=3D"gmail_quote"><blockquote class=3D"gmail_quote" style=3D"m=
argin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left=
:1ex"><div dir=3D"ltr"><div>Remember: what you want<i> is not structured bi=
ndings</i>.
Structured binding is about unpacking objects that store data into=20
multiple variable-like constructs. You don't have such a object, and yo=
u
don't really want one. The only reason you created a tuple of values=
=20
was because structured binding <i>requires</i> it.</div><div><br></div><div=
>What
you really want is the ability to declare multiple variables of=20
different types in a single declaration statement. When `auto` was being
standardized, there was discussion about allowing precisely that:</div><di=
v><br></div><div style=3D"border:1px solid rgb(187,187,187);word-wrap:break=
-word;background-color:rgb(250,250,250)"><code><div><span style=3D"color:rg=
b(0,0,136)">auto</span><span style=3D"color:rgb(0,0,0)"> x </span><span sty=
le=3D"color:rgb(102,102,0)">=3D</span><span style=3D"color:rgb(0,0,0)"> </s=
pan><span style=3D"color:rgb(0,102,102)">5.0f</span><span style=3D"color:rg=
b(102,102,0)">,</span><span style=3D"color:rgb(0,0,0)"> y </span><span styl=
e=3D"color:rgb(102,102,0)">=3D</span><span style=3D"color:rgb(0,0,0)"> </sp=
an><span style=3D"color:rgb(0,102,102)">10</span><span style=3D"color:rgb(1=
02,102,0)">,</span><span style=3D"color:rgb(0,0,0)"> z </span><span style=
=3D"color:rgb(102,102,0)">=3D</span><span style=3D"color:rgb(0,0,0)"> std</=
span><span style=3D"color:rgb(102,102,0)">::</span><span style=3D"color:rgb=
(0,0,136)">string</span><span style=3D"color:rgb(102,102,0)">(</span><span =
style=3D"color:rgb(0,136,0)">"foo"</span><span style=3D"color:rgb=
(102,102,0)">);</span><span style=3D"color:rgb(0,0,0)"><br></span></div></c=
ode></div><br><div>These would deduce 3 different types for the 3 variables=
.. The committee specifically decided<i> against</i> doing this.</div></div>=
</blockquote><div><br></div><div>Deciding
against this seems to me to have been, in hindsight, the wrong=20
decision. Perhaps this error can be corrected in a future standard?</div></=
div></div></div></div></blockquote><div><br></div></span><div>Well, changin=
g it is possible. At present, [dcl.spec.auto]/7 says:</div><div><br></div><=
div>>
The type of each declared variable is determined by placeholder type=20
deduction (10.1.7.4.1), and if the type that replaces the placeholder=20
type is not the same in each deduction, the program is ill-formed.</div><di=
v><br></div><div>This
means that every declaration which would deduce different types is at=20
present illegal. So removing this restriction would not break any=20
currently legal code.</div><div><br></div><div>And this change would be a <=
i>lot</i>
more palatable than (ab)using structured binding for this purpose. It=20
would also have semantics that are more immediately obvious than those=20
for (ab)using structured binding in this way.<br></div><div><br></div><div>=
Though personally, I still think it's a bad idea.<br></div></div></bloc=
kquote><div><br></div><div>Do you mind explaining why? Because to me it see=
ms like a splendid idea. To me, <span style=3D"font-family:monospace,monosp=
ace">auto x =3D foo(), y =3D bar();</span> seems succinct and neat. Someone=
who didn't know the language would read this and naturally conclude th=
at x and y may be of different types.<br></div></div></div></div></blockquo=
te><div><br></div></span><div>I don't like it precisely <i>because</i> =
it encourages you to type `auto x =3D foo(), y =3D bar();`. Those are two i=
ndependent operations; two separate components of whatever algorithm you=
9;re writing. Unless there is some obvious connection between `foo` and `ba=
r`, they have no business being on the same line.</div><div><br></div><div>=
It's bad coding style, and it ought to fail code review.</div></div></b=
lockquote><div><br></div><div>Then we are at opposite ends of the spectrum =
here. I do not agree that "succinct expression of abstract intent"=
; equals "bad coding style".</div><div><br></div><blockquote clas=
s=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid r=
gb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><span class=3D"gmail-"><=
div><br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px=
0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D=
"ltr"><div><div class=3D"gmail_quote"><div></div><blockquote class=3D"gmail=
_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204=
,204);padding-left:1ex"><div dir=3D"ltr"><div></div><span><div>I have yet t=
o see a reasonable rationalisation (in the light of since-gathered experien=
ce) of this decision.<br></div><div><br></div></span><div>It's you who =
have to come up with a rationalization <i>for</i>
the change, not the other way around. If "the light of since-gathered=
=20
experience" really is on your side, you ought to be able to look at al=
l=20
of the old arguments against it and answer them one-by-one based on that
experience.</div></div></blockquote><div><br></div><div>For one, it's =
more naturally logical to imagine that an auto variable will have the type =
of its initialiser.<br></div></div></div></div></blockquote><div><br></div>=
</span><div>That's not an answer to those arguments. Indeed, you didn&#=
39;t even state what those arguments are.</div><span class=3D"gmail-"><div>=
<br></div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8=
ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr=
"><div><div class=3D"gmail_quote"><div></div><blockquote class=3D"gmail_quo=
te" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204=
);padding-left:1ex"><div dir=3D"ltr"><div>Be sure to bring up the Range TS =
Iterator/Sentinel paradigm. That's <i>always</i> a slam-dunk when it co=
mes to deducing the same type ;)<br></div></div></blockquote><div><br></div=
><div>I'm not sure what you mean here. In any range-based algorithm you=
will certainly want the ability for the iterator to be of a different type=
to the sentinel. multi-typed auto would help this.<br></div></div></div></=
div></blockquote><div><br></div></span><div>... right. Which is why I said =
you<i> should</i> bring it up. I wasn't being sarcastic.</div><div><br>=
</div><div>Consider what I just said about having two "independent ope=
rations" on the same line. If you're extracting begin/end from a r=
ange, then those<i> aren't</i> "two independent operations". =
They're a single logical thought:</div><div><br></div><div class=3D"gma=
il-m_2617265813871618012prettyprint" style=3D"border:1px solid rgb(187,187,=
187);word-wrap:break-word;background-color:rgb(250,250,250)"><code class=3D=
"gmail-m_2617265813871618012prettyprint"><div class=3D"gmail-m_261726581387=
1618012subprettyprint"><span class=3D"gmail-m_2617265813871618012styled-by-=
prettify" style=3D"color:rgb(0,0,136)">auto</span><span class=3D"gmail-m_26=
17265813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)"> beg </span=
><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"col=
or:rgb(102,102,0)">=3D</span><span class=3D"gmail-m_2617265813871618012styl=
ed-by-prettify" style=3D"color:rgb(0,0,0)"> rng</span><span class=3D"gmail-=
m_2617265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">.</=
span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D=
"color:rgb(0,0,136)">begin</span><span class=3D"gmail-m_2617265813871618012=
styled-by-prettify" style=3D"color:rgb(102,102,0)">(),</span><span class=3D=
"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)">=
</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=
=3D"color:rgb(0,0,136)">end</span><span class=3D"gmail-m_261726581387161801=
2styled-by-prettify" style=3D"color:rgb(0,0,0)"> </span><span class=3D"gmai=
l-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">=
=3D</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" sty=
le=3D"color:rgb(0,0,0)"> rng</span><span class=3D"gmail-m_26172658138716180=
12styled-by-prettify" style=3D"color:rgb(102,102,0)">.</span><span class=3D=
"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,0,136)=
">end</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" s=
tyle=3D"color:rgb(102,102,0)">();</span></div></code></div><div><br></div><=
div>When you have something that is conceptually atomic that, by reason of =
implementation, requires two distinct actions,<i> that</i> is when it is ap=
propriate to stick them in one line.</div></div></blockquote><div><br></div=
><div>I think we agree here. Acquiring an index counter and the limits of a=
range seem to me to be part of the same logical atomic operation.=C2=A0</d=
iv><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bord=
er-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div>=
<br></div><div>Of course, you'll naturally try to say that getting iter=
ators for two separate ranges is also a single logical thought to your algo=
rithm. But I contest this because they're not atomic actions. Getting t=
he beginning of a range is useless without getting its end (in most cases).=
That's what makes the pair of actions "atomic"; you can'=
t do <i>anything</i> with them until both are complete.</div></div></blockq=
uote><div><br></div><div>I wholeheartedly disagree. The c++ memory model ma=
ndates that getting the two pairs of iterators is indeed atomic. Everything=
between two memory fences is logically atomic. This is the foundation of t=
he as-if rule. This is unarguable.</div><div>=C2=A0</div><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg=
b(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Howev=
er, getting one iterator range can be useful without getting some other ite=
rator range. It may not be useful to<i> your</i> algorithm, but it is still=
useful in the general sense.</div></div></blockquote><div><br></div><div>A=
gree.=C2=A0</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"=
margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-lef=
t:1ex"><div dir=3D"ltr"><div><br></div><div>That's my personal dividing=
line.</div></div></blockquote><div><br></div><div>With the greatest respec=
t, I cannot allow your personal opinions alone to hold back useful evolutio=
ns of the language. The fact that you are against the use of <font face=3D"=
monospace, monospace">auto</font> is very alarming to me.</div><div>=C2=A0<=
/div><blockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;bo=
rder-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><di=
v><i><br></i></div><div><span class=3D"gmail-"><span style=3D"float:none;ba=
ckground-color:transparent;color:rgb(34,34,34);font-family:Arial,Helvetica,=
sans-serif;font-size:13px;font-style:normal;font-variant-ligatures:normal;f=
ont-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:le=
ft;text-decoration:none;text-indent:0px;text-transform:none;white-space:nor=
mal;word-spacing:0px;display:inline">On Thursday, December 14, 2017 at 7:37=
:22 AM UTC-5, Richard Hodges wrote:</span><blockquote class=3D"gmail_quote"=
><div style=3D"border-color:rgb(34,34,34);border-style:none;border-width:0p=
x;margin:0px;padding:0px" dir=3D"ltr">Having pondered the responses, it tur=
ns out that I can express my algorithm in a tightly scoped, DRY and legal m=
anner in current c++ like this:</div></blockquote><div><br></div></span><di=
v>I'm not really sure what that proves. You can accomplish the same thi=
ng by using curly braces:</div><div><br></div><div class=3D"gmail-m_2617265=
813871618012prettyprint" style=3D"border:1px solid rgb(187,187,187);word-wr=
ap:break-word;background-color:rgb(250,250,250)"><code class=3D"gmail-m_261=
7265813871618012prettyprint"><div class=3D"gmail-m_2617265813871618012subpr=
ettyprint"><span class=3D"gmail-m_2617265813871618012styled-by-prettify" st=
yle=3D"color:rgb(102,102,0)">{</span><span class=3D"gmail-m_261726581387161=
8012styled-by-prettify" style=3D"color:rgb(0,0,0)"><br>=C2=A0 std</span><sp=
an class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:r=
gb(102,102,0)">::</span><span class=3D"gmail-m_2617265813871618012styled-by=
-prettify" style=3D"color:rgb(0,0,0)">size_t ix </span><span class=3D"gmail=
-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">=
=3D</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" sty=
le=3D"color:rgb(0,0,0)"> </span><span class=3D"gmail-m_2617265813871618012s=
tyled-by-prettify" style=3D"color:rgb(0,102,102)">0</span><span class=3D"gm=
ail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)"=
>;</span><span class=3D"gmail-"><span class=3D"gmail-m_2617265813871618012s=
tyled-by-prettify" style=3D"color:rgb(0,0,0)"><br>=C2=A0 </span><span class=
=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,0,1=
36)">auto</span><span class=3D"gmail-m_2617265813871618012styled-by-prettif=
y" style=3D"color:rgb(0,0,0)"> first </span><span class=3D"gmail-m_26172658=
13871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">=3D</span><sp=
an class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:r=
gb(0,0,0)"> </span><span class=3D"gmail-m_2617265813871618012styled-by-pret=
tify" style=3D"color:rgb(0,0,136)">begin</span><span class=3D"gmail-m_26172=
65813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">(</span><s=
pan class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:=
rgb(0,0,0)">v</span><span class=3D"gmail-m_2617265813871618012styled-by-pre=
ttify" style=3D"color:rgb(102,102,0)">);</span><span class=3D"gmail-m_26172=
65813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)"><br>=C2=A0 </s=
pan><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"=
color:rgb(0,0,136)">auto</span><span class=3D"gmail-m_2617265813871618012st=
yled-by-prettify" style=3D"color:rgb(0,0,0)"> </span><span class=3D"gmail-m=
_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,0,136)">last</=
span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D=
"color:rgb(0,0,0)"> </span><span class=3D"gmail-m_2617265813871618012styled=
-by-prettify" style=3D"color:rgb(102,102,0)">=3D</span><span class=3D"gmail=
-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)"> </spa=
n><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"co=
lor:rgb(0,0,136)">end</span><span class=3D"gmail-m_2617265813871618012style=
d-by-prettify" style=3D"color:rgb(102,102,0)">(</span><span class=3D"gmail-=
m_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)">v</span=
><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"col=
or:rgb(102,102,0)">);</span></span><span class=3D"gmail-m_26172658138716180=
12styled-by-prettify" style=3D"color:rgb(0,0,0)"><br>=C2=A0 </span><span cl=
ass=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,=
0,136)">for</span><span class=3D"gmail-m_2617265813871618012styled-by-prett=
ify" style=3D"color:rgb(102,102,0)">(;</span><span class=3D"gmail-m_2617265=
813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)"> first </span><s=
pan class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"color:=
rgb(102,102,0)">!=3D</span><span class=3D"gmail-m_2617265813871618012styled=
-by-prettify" style=3D"color:rgb(0,0,0)"> </span><span class=3D"gmail-m_261=
7265813871618012styled-by-prettify" style=3D"color:rgb(0,0,136)">last</span=
><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"col=
or:rgb(102,102,0)">;</span><span class=3D"gmail-m_2617265813871618012styled=
-by-prettify" style=3D"color:rgb(0,0,0)"> </span><span class=3D"gmail-m_261=
7265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">++</span=
><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"col=
or:rgb(0,0,0)">first</span><span class=3D"gmail-m_2617265813871618012styled=
-by-prettify" style=3D"color:rgb(102,102,0)">,</span><span class=3D"gmail-m=
_2617265813871618012styled-by-prettify" style=3D"color:rgb(0,0,0)"> </span>=
<span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"colo=
r:rgb(102,102,0)">++</span><span class=3D"gmail-m_2617265813871618012styled=
-by-prettify" style=3D"color:rgb(0,0,0)">ix</span><span class=3D"gmail-m_26=
17265813871618012styled-by-prettify" style=3D"color:rgb(102,102,0)">)</span=
><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=3D"col=
or:rgb(0,0,0)"><br>=C2=A0 =C2=A0 </span><span class=3D"gmail-m_261726581387=
1618012styled-by-prettify" style=3D"color:rgb(136,0,0)">//Actual loop body;=
</span><span class=3D"gmail-m_2617265813871618012styled-by-prettify" style=
=3D"color:rgb(0,0,0)"><br></span><span class=3D"gmail-m_2617265813871618012=
styled-by-prettify" style=3D"color:rgb(102,102,0)">}</span></div></code></d=
iv><div><br></div><div>You can even remove the `begin` line by adding it to=
the `for` statement. So what's the downside of this? Do you really nee=
d to write these multi-variable things<i> that often</i> that we need a lan=
guage change? You've not answered that question.</div></div></div></blo=
ckquote><div><br></div><div>That's a fair question. My initial response=
is that the extra curly braces are not beautiful. And to me elegance and b=
eauty of code presentation is a factor in my enjoyment of writing it. To me=
, that's enough of a reason for a change (if not the one I originally p=
roposed). I appreciate that you may not take aesthetics to heart as much as=
me.</div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margi=
n:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex=
"><div dir=3D"ltr"><div><div><br></div><blockquote class=3D"gmail_quote"><d=
iv style=3D"border-color:rgb(34,34,34);border-style:none;border-width:0px;m=
argin:0px;padding:0px" dir=3D"ltr"><span class=3D"gmail-"><div style=3D"bor=
der-color:rgb(34,34,34);border-style:none;border-width:0px;margin:0px;paddi=
ng:0px">I really do think that there is a case for allowing:</div></span><d=
iv style=3D"border-color:rgb(34,34,34);border-style:none;border-width:0px;m=
argin:0px;padding:0px"><span class=3D"gmail-"><div style=3D"border-color:rg=
b(34,34,34);border-style:none;border-width:0px;margin:0px;padding:0px"><br>=
</div><div style=3D"border-color:rgb(34,34,34);border-style:none;border-wid=
th:0px;margin:0px;padding:0px"><div style=3D"border-color:rgb(0,0,0);border=
-style:none;border-width:0px;color:rgb(0,0,0);font-size:14px;margin:0px;pad=
ding:0px;white-space:pre-wrap"><font face=3D"monospace, monospace" style=3D=
"border-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;padd=
ing:0px">=C2=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<span style=3D"bord=
er-color:rgb(9,136,90);border-style:none;border-width:0px;color:rgb(9,136,9=
0);margin:0px;padding:0px">0</span>)] ; auto&& elem : v)</font></di=
v><div style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;=
color:rgb(0,0,0);font-size:14px;margin:0px;padding:0px;white-space:pre-wrap=
"><div style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;=
margin:0px;padding:0px"><font face=3D"monospace, monospace" style=3D"border=
-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;padding:0px=
">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(elem=
, </font><span style=3D"border-color:rgb(0,0,0);border-style:none;border-wi=
dth:0px;font-family:monospace,monospace;margin:0px;padding:0px">i++)</span>=
<span style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;f=
ont-family:monospace,monospace;margin:0px;padding:0px">;</span></div><div s=
tyle=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0=
px;padding:0px"><span style=3D"border-color:rgb(0,0,0);border-style:none;bo=
rder-width:0px;font-family:monospace,monospace;margin:0px;padding:0px"><br =
style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;margin:=
0px;padding:0px"></span></div></div></div></span><div style=3D"border-color=
:rgb(34,34,34);border-style:none;border-width:0px;margin:0px;padding:0px"><=
div style=3D"border-color:rgb(34,34,34);border-style:none;border-width:0px;=
margin:0px;padding:0px">or:</div><div style=3D"border-color:rgb(0,0,0);bord=
er-style:none;border-width:0px;color:rgb(0,0,0);font-size:14px;margin:0px;p=
adding:0px;white-space:pre-wrap"><font face=3D"monospace, monospace" style=
=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;p=
adding:0px"><br style=3D"border-color:rgb(0,0,0);border-style:none;border-w=
idth:0px;margin:0px;padding:0px"></font></div><div style=3D"border-color:rg=
b(0,0,0);border-style:none;border-width:0px;color:rgb(0,0,0);font-size:14px=
;margin:0px;padding:0px;white-space:pre-wrap"><font face=3D"monospace, mono=
space" style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;=
margin:0px;padding:0px">=C2=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<spa=
n style=3D"border-color:rgb(9,136,90);border-style:none;border-width:0px;co=
lor:rgb(9,136,90);margin:0px;padding:0px">0</span>), first =3D begin(v), la=
st =3D end(v)] ; first !=3D last ; ++first, ++i)</font></div><div style=3D"=
border-color:rgb(0,0,0);border-style:none;border-width:0px;color:rgb(0,0,0)=
;font-size:14px;margin:0px;padding:0px;white-space:pre-wrap"><div style=3D"=
border-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;paddi=
ng:0px"><font face=3D"monospace, monospace" style=3D"border-color:rgb(0,0,0=
);border-style:none;border-width:0px;margin:0px;padding:0px">=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><sp=
an style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;font=
-family:monospace,monospace;margin:0px;padding:0px">i)</span><span style=3D=
"border-color:rgb(0,0,0);border-style:none;border-width:0px;font-family:mon=
ospace,monospace;margin:0px;padding:0px">;</span></div><div style=3D"border=
-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;padding:0px=
"><span style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px=
;font-family:monospace,monospace;margin:0px;padding:0px"><br style=3D"borde=
r-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;padding:0p=
x"></span></div></div></div><div style=3D"border-color:rgb(34,34,34);border=
-style:none;border-width:0px;margin:0px;padding:0px"><div style=3D"border-c=
olor:rgb(34,34,34);border-style:none;border-width:0px;margin:0px;padding:0p=
x"><div style=3D"border-color:rgb(34,34,34);border-style:none;border-width:=
0px;margin:0px;padding:0px">or:</div><div style=3D"border-color:rgb(0,0,0);=
border-style:none;border-width:0px;color:rgb(0,0,0);font-size:14px;margin:0=
px;padding:0px;white-space:pre-wrap"><font face=3D"monospace, monospace" st=
yle=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0p=
x;padding:0px"><br style=3D"border-color:rgb(0,0,0);border-style:none;borde=
r-width:0px;margin:0px;padding:0px"></font></div><div style=3D"border-color=
:rgb(0,0,0);border-style:none;border-width:0px;color:rgb(0,0,0);font-size:1=
4px;margin:0px;padding:0px;white-space:pre-wrap"><font face=3D"monospace, m=
onospace" style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0=
px;margin:0px;padding:0px">=C2=A0=C2=A0=C2=A0 for(auto i =3D std::size_t(<s=
pan style=3D"border-color:rgb(9,136,90);border-style:none;border-width:0px;=
color:rgb(9,136,90);margin:0px;padding:0px">0</span>), first =3D begin(v), =
last =3D end(v) ; first !=3D last ; ++first, ++i)</font></div><div style=3D=
"border-color:rgb(0,0,0);border-style:none;border-width:0px;color:rgb(0,0,0=
);font-size:14px;margin:0px;padding:0px;white-space:pre-wrap"><div style=3D=
"border-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;padd=
ing:0px"><font face=3D"monospace, monospace" style=3D"border-color:rgb(0,0,=
0);border-style:none;border-width:0px;margin:0px;padding:0px">=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><sp=
an style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px;font=
-family:monospace,monospace;margin:0px;padding:0px">i)</span><span style=3D=
"border-color:rgb(0,0,0);border-style:none;border-width:0px;font-family:mon=
ospace,monospace;margin:0px;padding:0px">;</span></div><div style=3D"border=
-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;padding:0px=
"><span style=3D"border-color:rgb(0,0,0);border-style:none;border-width:0px=
;font-family:monospace,monospace;margin:0px;padding:0px"><br style=3D"borde=
r-color:rgb(0,0,0);border-style:none;border-width:0px;margin:0px;padding:0p=
x"></span></div></div></div></div><span class=3D"gmail-"><div style=3D"bord=
er-color:rgb(34,34,34);border-style:none;border-width:0px;margin:0px;paddin=
g:0px"><div style=3D"border-color:rgb(34,34,34);border-style:none;border-wi=
dth:0px;margin:0px;padding:0px">since we already have this ability in the n=
asty lambda above, why not provide the ability in a way that's easy to =
reason about?</div></div></span></div></div></blockquote><div><br></div><di=
v>You can already do the first one; just get rid of the structured binding =
bit. And the second and third ones have nothing to do with one another. The=
y have completely different semantics.</div></div><blockquote class=3D"gmai=
l_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,20=
4,204);padding-left:1ex">
</blockquote></div><span class=3D"gmail-">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/79fdf8b2-08e8-4889-a1b6-50f0f05eb0d0%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/79fd=
f8b2-08e8-4889-<wbr>a1b6-50f0f05eb0d0%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CALvx3hb3-D%3D1y9NzwomcG7rhF_5bHuj3VT=
vOjD3Pe_gLCZGOvA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hb3-D%3D1=
y9NzwomcG7rhF_5bHuj3VTvOjD3Pe_gLCZGOvA%40mail.gmail.com</a>.<br />
--001a114aad7824753b056050efdd--
.
Author: adrian.hawryluk@gmail.com
Date: Sat, 16 Dec 2017 07:57:31 -0800 (PST)
Raw View
------=_Part_5811_117110218.1513439851234
Content-Type: multipart/alternative;
boundary="----=_Part_5812_645554558.1513439851234"
------=_Part_5812_645554558.1513439851234
Content-Type: text/plain; charset="UTF-8"
On Thursday, December 14, 2017 at 10:00:45 AM UTC-5, Richard Hodges wrote:
>
> > I'm sure some people do this, but an indexed range view would handle
> this much more easily and compactly:
> >
> > for(auto &[i, val] : std::counted_view(rng))
> > {...}
>
> There is currently no such thing as a std::counted_view but I take your
> point. The problems with this approach are:
>
>
> 1. You have to think of a meaningful name for every trivial range
> adapter you ever want to write. This is a bigger problem in a large
> organisation or distributed team that it might at first seem.
> 2. Range adapters involve abstracting out one's algorithm into a
> verbose class. Precisely the opposite of the intent of range-based for
> (keep simple things simple, keep logic in the loop body)
> 3. You have to document and publish what is essentially a line or 2 of
> trivial self-documenting code.
> 4. You have to wait for at least 3 years of squabbling in the isocpp
> committee before it'll be in the std namespace*
>
> * ok, fair enough, you could submit it to boost and get it out in 3 months
> if you're happy with boost::counted_view.
>
It would seem to me that a generic 'view' class could be made for this sort
of thing which could be inherited to ease the ability for developers to use
this methodology, allowing the creation of more specialized 'view' classes.
--
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/0e6c6a29-3241-4365-8e54-643d823e2e15%40isocpp.org.
------=_Part_5812_645554558.1513439851234
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Thursday, December 14, 2017 at 10:00:45 AM UTC-5, Richa=
rd Hodges 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"lt=
r"><span style=3D"color:rgb(80,0,80);font-size:12.8px">> I'm sure so=
me people do this, but an indexed range view would handle this much more ea=
sily and compactly:</span><br style=3D"color:rgb(80,0,80);font-size:12.8px"=
><span style=3D"color:rgb(80,0,80);font-size:12.8px">></span><br style=
=3D"color:rgb(80,0,80);font-size:12.8px"><span style=3D"color:rgb(80,0,80);=
font-size:12.8px">> for(auto &[i, val] : std::counted_view(rng))</sp=
an><br style=3D"color:rgb(80,0,80);font-size:12.8px"><span style=3D"color:r=
gb(80,0,80);font-size:12.8px">> {...}</span><br style=3D"color:rgb(80,0,=
80);font-size:12.8px"><div><br></div><div>There is currently no such thing =
as a std::counted_view but I take your point. The problems with this approa=
ch are:</div><div><br></div><div><ol><li>You have to think of a meaningful =
name for every trivial range adapter you ever want to write. This is a bigg=
er problem in a large organisation or distributed team that it might at fir=
st seem.</li><li>Range adapters involve abstracting out one's algorithm=
into a verbose class. Precisely the opposite of the intent of range-based =
for (keep simple things simple, keep logic in the loop body)</li><li>You ha=
ve to document and publish what is essentially a line or 2 of trivial self-=
documenting code.</li><li>You have to wait for at least 3 years of squabbli=
ng in the isocpp committee before it'll be in the std namespace*</li></=
ol><div>* ok, fair enough, you could submit it to boost and get it out in 3=
months if you're happy with boost::counted_view.</div></div></div></bl=
ockquote><div><br></div><div>It would seem to me that a generic 'view&#=
39; class could be made for this sort of thing which could be inherited to =
ease the ability for developers to use this methodology, allowing the creat=
ion of more specialized 'view' classes.</div><div><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/0e6c6a29-3241-4365-8e54-643d823e2e15%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/0e6c6a29-3241-4365-8e54-643d823e2e15=
%40isocpp.org</a>.<br />
------=_Part_5812_645554558.1513439851234--
------=_Part_5811_117110218.1513439851234--
.
Author: adrian.hawryluk@gmail.com
Date: Sat, 16 Dec 2017 08:06:20 -0800 (PST)
Raw View
------=_Part_6024_658776558.1513440381076
Content-Type: multipart/alternative;
boundary="----=_Part_6025_737377915.1513440381076"
------=_Part_6025_737377915.1513440381076
Content-Type: text/plain; charset="UTF-8"
On Thursday, December 14, 2017 at 12:19:47 PM UTC-5, Nicol Bolas wrote:
>
> On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:
>
>> I really do think that there is a case for allowing:
>>
>> for(auto [i = std::size_t(0)] ; auto&& elem : v)
>> f(elem, i++);
>>
>> or:
>>
>> for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ;
>> first != last ; ++first, ++i)
>> f(*first, i);
>>
>> or:
>>
>> for(auto i = std::size_t(0), first = begin(v), last = end(v) ; first
>> != last ; ++first, ++i)
>> f(*first, i);
>>
>> since we already have this ability in the nasty lambda above, why not
>> provide the ability in a way that's easy to reason about?
>>
>
> You can already do the first one; just get rid of the structured binding
> bit. And the second and third ones have nothing to do with one another.
> They have completely different semantics.
>
Um, I don't think you can do the first one. Unless g++7.2.0 isn't
complaint yet, the following snippet will not comple:
std::vector<int> v = {1,2,3,4};
for(auto i=0; auto&& e : v)
{
std::cout << e << std::endl;
}
--
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/7928cfe2-5779-4f69-a1e4-1d329631c6d8%40isocpp.org.
------=_Part_6025_737377915.1513440381076
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Thursday, December 14, 2017 at 12:19:47 PM UTC-=
5, Nicol Bolas wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr">On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges=
wrote:<div><blockquote class=3D"gmail_quote"><div style=3D"border-bottom-c=
olor:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px" dir=3D"ltr"><d=
iv style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;=
border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:=
none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px">I really do think that there is a case for allowing:</div><div=
style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:no=
ne;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bord=
er-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px"><br></div><div style=3D"border-bottom-color:rgb(3=
4,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rg=
b(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px;white-space:pre"><font face=3D"monospace, monospace" style=3D"bor=
der-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0p=
x;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:none;border-right-width:0=
px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=C2=A0=C2=A0=
=C2=A0 for(auto [i =3D std::size_t(<span style=3D"border-bottom-color:rgb(9=
,136,90);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(9,136,90);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(9,136,90);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(9,136,90);border-top-style:none;border-top-width:0px;color:rgb(9=
,136,90);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">0</s=
pan>)] ; auto&& elem : v)</font></div><div style=3D"border-bottom-c=
olor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-to=
p-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0=
,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margi=
n-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top=
:0px;white-space:pre"><div style=3D"border-bottom-color:rgb(0,0,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);borde=
r-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px"><font face=3D"monospace, monospace" style=3D"borde=
r-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px">=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(elem, </font><span st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;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:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px">i++)</span><span style=3D"border-bottom-color:r=
gb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-family:monospa=
ce,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:=
0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
;</span></div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-st=
yle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-botto=
m-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-ri=
ght-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-to=
p-style:none;border-top-width:0px;font-family:monospace,monospace;margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bo=
ttom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px"></span></div></div><=
/div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top=
-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34=
,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px">or:</div><div style=3D"border-bottom-col=
or:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-=
color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0=
);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px;white-space:pre"><font face=3D"monospace, monospace" style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-b=
ottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px"></font></div><div s=
tyle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-=
width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px;white-space:pre"><font face=3D"monospace, monos=
pace" style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bord=
er-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px">=C2=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<span style=3D"border-bo=
ttom-color:rgb(9,136,90);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(9,136,90);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(9,136,90);border-right-style:none;border-right-widt=
h:0px;border-top-color:rgb(9,136,90);border-top-style:none;border-top-width=
:0px;color:rgb(9,136,90);margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">0</span>), first =3D begin(v), last =3D end(v)] ; first !=3D la=
st ; ++first, ++i)</font></div><div style=3D"border-bottom-color:rgb(0,0,0)=
;border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0=
,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:1=
4px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-spac=
e:pre"><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:non=
e;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:no=
ne;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:non=
e;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px"><font face=3D"monospace, monospace" style=3D"border-bottom-color:=
rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-col=
or:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-col=
or:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><span style=3D"border=
-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font=
-family:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px">i)</span><span style=3D"border-bottom-color:rgb(0,0,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bo=
rder-top-style:none;border-top-width:0px;font-family:monospace,monospace;ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px">;</span></div><=
div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border=
-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bo=
rder-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;b=
order-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;=
border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bo=
rder-top-width:0px;font-family:monospace,monospace;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(=
0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:r=
gb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px"></span></div></div></div><div style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top=
-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34=
,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px">or:</div><div style=3D"border-bottom-col=
or:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-=
color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0=
);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px;white-space:pre"><font face=3D"monospace, monospace" style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-b=
ottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px"></font></div><div s=
tyle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-=
width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px;white-space:pre"><font face=3D"monospace, monos=
pace" style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bord=
er-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px">=C2=A0=C2=A0=C2=A0 for(auto i =3D std::size_t(<span style=3D"border-bot=
tom-color:rgb(9,136,90);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(9,136,90);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(9,136,90);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(9,136,90);border-top-style:none;border-top-width:=
0px;color:rgb(9,136,90);margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px">0</span>), first =3D begin(v), last =3D end(v) ; first !=3D last=
; ++first, ++i)</font></div><div style=3D"border-bottom-color:rgb(0,0,0);b=
order-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0=
);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:14p=
x;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-space:=
pre"><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;=
border-bottom-width:0px;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-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"><font face=3D"monospace, monospace" style=3D"border-bottom-color:rg=
b(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color=
:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><span style=3D"border-bo=
ttom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-fa=
mily:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">i)</span><span style=3D"border-bottom-color:rgb(0,0,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);borde=
r-top-style:none;border-top-width:0px;font-family:monospace,monospace;margi=
n-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom=
:0px;padding-left:0px;padding-right:0px;padding-top:0px">;</span></div><div=
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-=
right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-to=
p-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><=
span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;borde=
r-top-width:0px;font-family:monospace,monospace;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0=
,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(=
0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px"></span></div></div></div></div><div st=
yle=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-=
top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margi=
n-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-righ=
t:0px;padding-top:0px">since we already have this ability in the nasty lamb=
da above, why not provide the ability in a way that's easy to reason ab=
out?</div></div></div></div></blockquote><div><br></div><div>You can alread=
y do the first one; just get rid of the structured binding bit. And the sec=
ond and third ones have nothing to do with one another. They have completel=
y different semantics.</div></div></div></blockquote><div><br></div><div>Um=
, I don't think you can do the first one.=C2=A0 Unless g++7.2.0 isn'=
;t complaint yet, the following snippet will not comple:</div><div><br></di=
v><div><span style=3D"white-space:pre"> </span>std::vector<int> v =3D=
{1,2,3,4};</div><div><span style=3D"white-space:pre"> </span>for(auto i=3D=
0; auto&& e : v)</div><div><span style=3D"white-space:pre"> </span>=
{</div><div><span style=3D"white-space:pre"> </span>std::cout << e &=
lt;< std::endl;</div><div><span style=3D"white-space:pre"> </span>}</div=
><div>=C2=A0</div><div><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/7928cfe2-5779-4f69-a1e4-1d329631c6d8%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-1d329631c6d8=
%40isocpp.org</a>.<br />
------=_Part_6025_737377915.1513440381076--
------=_Part_6024_658776558.1513440381076--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Fri, 5 Jan 2018 21:27:09 -0500
Raw View
--001a114075da5315490562124dbe
Content-Type: text/plain; charset="UTF-8"
FWIW, Richard, I think your idea has merits. I have often found it a bit
annoying not to be able to declare variables of different types in the init
section of a for statement, and inspiration from lambda capture syntax /
structured bindings seems harmonious to me.
Alternatives suggested so far given the existing language would either
force manually introducing a scope around the for loop, or accepting
unnecessarily long lifetimes for those additional variables; the first one
is unpleasant (sort of a hack to get around a limitation), the second one
is actually adverse to what would be an appropriate strategy for the
management of those variables' lifetimes. Neither is as satisfactory as
your idea.
The initialization par of the for(auto [a = 0, b = ""s]; a != N; ++a) { /*
.... */ } form can be seen a emulating an implicit make_tuple as you are
suggesting, or as initializing a and b from an anonymous struct of sorts.
Either works as a mental model for me, and the proposed syntax seems easier
to teach and more elegant than what it would replace given that mental
model. It's a syntax that, for someone who has played with structured
bindings already, just seems very natural (in fact, to me, you just hit a
'"why didn't I think of it?" spot :) ).
Are you planning a paper for EWG with this?
Thanks!
2017-12-16 11:06 GMT-05:00 <adrian.hawryluk@gmail.com>:
>
>
> On Thursday, December 14, 2017 at 12:19:47 PM UTC-5, Nicol Bolas wrote:
>>
>> On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:
>>
>>> I really do think that there is a case for allowing:
>>>
>>> for(auto [i = std::size_t(0)] ; auto&& elem : v)
>>> f(elem, i++);
>>>
>>> or:
>>>
>>> for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ;
>>> first != last ; ++first, ++i)
>>> f(*first, i);
>>>
>>> or:
>>>
>>> for(auto i = std::size_t(0), first = begin(v), last = end(v) ;
>>> first != last ; ++first, ++i)
>>> f(*first, i);
>>>
>>> since we already have this ability in the nasty lambda above, why not
>>> provide the ability in a way that's easy to reason about?
>>>
>>
>> You can already do the first one; just get rid of the structured binding
>> bit. And the second and third ones have nothing to do with one another.
>> They have completely different semantics.
>>
>
> Um, I don't think you can do the first one. Unless g++7.2.0 isn't
> complaint yet, the following snippet will not comple:
>
> std::vector<int> v = {1,2,3,4};
> for(auto i=0; auto&& e : v)
> {
> std::cout << e << std::endl;
> }
>
>
> --
> 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/7928cfe2-5779-4f69-
> a1e4-1d329631c6d8%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-1d329631c6d8%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CAKiZDp32jD8kxFL%2B3-gFePMRt7Xds8HO6NoWS_T%3DofaO3E539g%40mail.gmail.com.
--001a114075da5315490562124dbe
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div><div><div>FWIW, Richard, I think your idea has merits=
.. I have often found it a bit annoying not to be able to declare variables =
of different types in the init section of a for statement, and inspiration =
from lambda capture syntax / structured bindings seems harmonious to me.<br=
><br>Alternatives suggested so far given the existing language would either=
force manually introducing a scope around the for loop, or accepting unnec=
essarily long lifetimes for those additional variables; the first one is un=
pleasant (sort of a hack to get around a limitation), the second one is act=
ually adverse to what would be an appropriate strategy for the management o=
f those variables' lifetimes. Neither is as satisfactory as your idea.<=
br><br></div>The initialization par of the for(auto [a =3D 0, b =3D "&=
quot;s]; a !=3D N; ++a) { /* ... */ } form can be seen a emulating an impli=
cit make_tuple as you are suggesting, or as initializing a and b from an an=
onymous struct of sorts. Either works as a mental model for me, and the pro=
posed syntax seems easier to teach and more elegant than what it would repl=
ace given that mental model. It's a syntax that, for someone who has pl=
ayed with structured bindings already, just seems very natural (in fact, to=
me, you just hit a '"why didn't I think of it?" spot :) =
).<br><br></div>Are you planning a paper for EWG with this?<br><br></div>Th=
anks!<br><div><div>=C2=A0=C2=A0 <br></div></div></div><div class=3D"gmail_e=
xtra"><br><div class=3D"gmail_quote">2017-12-16 11:06 GMT-05:00 <span dir=
=3D"ltr"><<a href=3D"mailto:adrian.hawryluk@gmail.com" target=3D"_blank"=
>adrian.hawryluk@gmail.com</a>></span>:<br><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex=
"><div dir=3D"ltr"><span class=3D""><br><br>On Thursday, December 14, 2017 =
at 12:19:47 PM UTC-5, Nicol Bolas wrote:</span><blockquote class=3D"gmail_q=
uote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;paddin=
g-left:1ex"><div dir=3D"ltr"><span class=3D"">On Thursday, December 14, 201=
7 at 2:27:39 AM UTC-5, Richard Hodges wrote:</span><span class=3D""><div><b=
lockquote class=3D"gmail_quote"><div style=3D"border-bottom-color:rgb(34,34=
,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(34,34,34);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-col=
or:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px" dir=3D"ltr"><div style=3D"bo=
rder-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-to=
p-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">I=
really do think that there is a case for allowing:</div><div style=3D"bord=
er-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-widt=
h:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-=
width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><di=
v style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;b=
order-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:n=
one;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px"><br></div><div style=3D"border-bottom-color:rgb(34,34,34);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34)=
;border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,=
34);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,=
34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(=
0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:r=
gb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-=
size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;whit=
e-space:pre-wrap"><font style=3D"border-bottom-color:rgb(0,0,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-t=
op-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0 for(=
auto [i =3D std::size_t(<span style=3D"border-bottom-color:rgb(9,136,90);bo=
rder-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(9,136,=
90);border-left-style:none;border-left-width:0px;border-right-color:rgb(9,1=
36,90);border-right-style:none;border-right-width:0px;border-top-color:rgb(=
9,136,90);border-top-style:none;border-top-width:0px;color:rgb(9,136,90);ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px">0</span>)] ; au=
to&& elem : v)</font></div><div style=3D"border-bottom-color:rgb(0,=
0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb=
(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-si=
ze:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-=
space:pre-wrap"><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-righ=
t-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-=
style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px"><font style=3D"border-bottom-color:rgb(0,0,0);border-bot=
tom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-=
top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margi=
n-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-righ=
t:0px;padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(elem, </font><span style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;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:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;font-family:monospace,monospace;margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px">i++)</span><span style=3D"border-bottom-color:rgb(0,0=
,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(=
0,0,0);border-top-style:none;border-top-width:0px;font-family:monospace,mon=
ospace;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">;</spa=
n></div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:no=
ne;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-st=
yle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-styl=
e:none;border-top-width:0px;font-family:monospace,monospace;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-c=
olor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-to=
p-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px"></span></div></div></div><=
div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px">or:</div><div style=3D"border-bottom-color:rgb=
(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:=
rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font=
-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;whi=
te-space:pre-wrap"><font style=3D"border-bottom-color:rgb(0,0,0);border-bot=
tom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-=
top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margi=
n-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-righ=
t:0px;padding-top:0px" face=3D"monospace, monospace"><br style=3D"border-bo=
ttom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px"></font></div><div st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;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:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px;white-space:pre-wrap"><font style=3D"border-bott=
om-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;borde=
r-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px" face=3D"monospace, mon=
ospace">=C2=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<span style=3D"borde=
r-bottom-color:rgb(9,136,90);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(9,136,90);border-left-style:none;border-left-width=
:0px;border-right-color:rgb(9,136,90);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(9,136,90);border-top-style:none;border-top-w=
idth:0px;color:rgb(9,136,90);margin-bottom:0px;margin-left:0px;margin-right=
:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;p=
adding-top:0px">0</span>), first =3D begin(v), last =3D end(v)] ; first !=
=3D last ; ++first, ++i)</font></div><div style=3D"border-bottom-color:rgb(=
0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:r=
gb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-=
size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;whit=
e-space:pre-wrap"><div style=3D"border-bottom-color:rgb(0,0,0);border-botto=
m-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-ri=
ght-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-to=
p-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px"><font style=3D"border-bottom-color:rgb(0,0,0);border-b=
ottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);borde=
r-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);borde=
r-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><span sty=
le=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom=
-width:0px;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:none;border-righ=
t-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wi=
dth:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px">i)</span><span style=3D"border-bottom-color:rgb(=
0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:r=
gb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(0,0,0);border-top-style:none;border-top-width:0px;font-family:monospace,=
monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">;</=
span></div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-s=
tyle:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-s=
tyle:none;border-top-width:0px;font-family:monospace,monospace;margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px"></span></div></div></di=
v><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;=
border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-st=
yle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bot=
tom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34=
);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34=
,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb=
(34,34,34);border-left-style:none;border-left-width:0px;border-right-color:=
rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-col=
or:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px">or:</div><div style=3D"borde=
r-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;col=
or:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right=
:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;p=
adding-top:0px;white-space:pre-wrap"><font style=3D"border-bottom-color:rgb=
(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:=
rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;mar=
gin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px" face=3D"monospace, monospace"><br =
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-le=
ft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top=
-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></=
font></div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style=
:none;border-top-width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px;white-space:pre-wrap"><font st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;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:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px" face=
=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0 for(auto i =3D std::size_t(<sp=
an style=3D"border-bottom-color:rgb(9,136,90);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(9,136,90);border-left-style:none;=
border-left-width:0px;border-right-color:rgb(9,136,90);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(9,136,90);border-top-style:=
none;border-top-width:0px;color:rgb(9,136,90);margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">0</span>), first =3D begin(v), last =3D en=
d(v) ; first !=3D last ; ++first, ++i)</font></div><div style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rg=
b(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px;white-space:pre-wrap"><div style=3D"border-bottom-color:rgb(0,0,0=
);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,=
0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px"><font style=3D"border-bottom-color:rgb(0=
,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px" face=3D"monospace, monospace">=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </fo=
nt><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;b=
order-bottom-width:0px;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:none=
;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;b=
order-top-width:0px;font-family:monospace,monospace;margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px">i)</span><span style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-famil=
y:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;ma=
rgin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-=
top:0px">;</span></div><div style=3D"border-bottom-color:rgb(0,0,0);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bord=
er-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0);bor=
der-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0);=
border-top-style:none;border-top-width:0px;font-family:monospace,monospace;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"=
border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width=
:0px;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:none;border-right-widt=
h:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0p=
x;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></di=
v></div></div></div><div style=3D"border-bottom-color:rgb(34,34,34);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34=
,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34=
,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:=
rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-col=
or:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px">since we already have thi=
s ability in the nasty lambda above, why not provide the ability in a way t=
hat's easy to reason about?</div></div></div></div></blockquote><div><b=
r></div><div>You can already do the first one; just get rid of the structur=
ed binding bit. And the second and third ones have nothing to do with one a=
nother. They have completely different semantics.</div></div></span></div><=
/blockquote><div><br></div><div>Um, I don't think you can do the first =
one.=C2=A0 Unless g++7.2.0 isn't complaint yet, the following snippet w=
ill not comple:</div><div><br></div><div><span style=3D"white-space:pre-wra=
p"> </span>std::vector<int> v =3D {1,2,3,4};</div><div><span style=3D=
"white-space:pre-wrap"> </span>for(auto i=3D0; auto&& e : v)</div><=
div><span style=3D"white-space:pre-wrap"> </span>{</div><div><span style=3D=
"white-space:pre-wrap"> </span>std::cout << e << std::endl;</d=
iv><div><span style=3D"white-space:pre-wrap"> </span>}</div><div>=C2=A0</di=
v><div><br></div></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-1d329631c6d8%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/7928=
cfe2-5779-4f69-<wbr>a1e4-1d329631c6d8%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp32jD8kxFL%2B3-gFePMRt7Xds8HO6N=
oWS_T%3DofaO3E539g%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp32jD8k=
xFL%2B3-gFePMRt7Xds8HO6NoWS_T%3DofaO3E539g%40mail.gmail.com</a>.<br />
--001a114075da5315490562124dbe--
.
Author: Tony V E <tvaneerd@gmail.com>
Date: Fri, 05 Jan 2018 22:03:05 -0500
Raw View
<html><head></head><body lang=3D"en-US" style=3D"background-color: rgb(255,=
255, 255); line-height: initial;"> =
<div style=3D"width: 100%; fo=
nt-size: initial; font-family: Calibri, 'Slate Pro', sans-serif, sans-serif=
; color: rgb(31, 73, 125); text-align: initial; background-color: rgb(255, =
255, 255);">We should also keep in mind that pattern matching will need an =
easy, unobtrusive way to declare variables. Even auto [ ] might be too much=
.. It needs a single char like `x or something. </div> =
=
<div style=3D"width: 100%; font-size: i=
nitial; font-family: Calibri, 'Slate Pro', sans-serif, sans-serif; color: r=
gb(31, 73, 125); text-align: initial; background-color: rgb(255, 255, 255);=
"><br style=3D"display:initial"></div> =
=
=
<div style=3D"font-size: initial; font-family: Calibri, 'Slate Pro'=
, sans-serif, sans-serif; color: rgb(31, 73, 125); text-align: initial; bac=
kground-color: rgb(255, 255, 255);">Sent from my BlackBerry&=
nbsp;portable Babbage Device</div> =
=
<ta=
ble width=3D"100%" style=3D"background-color:white;border-spacing:0px;"> <t=
body><tr><td colspan=3D"2" style=3D"font-size: initial; text-align: initial=
; background-color: rgb(255, 255, 255);"> <div st=
yle=3D"border-style: solid none none; border-top-color: rgb(181, 196, 223);=
border-top-width: 1pt; padding: 3pt 0in 0in; font-family: Tahoma, 'BB Alph=
a Sans', 'Slate Pro'; font-size: 10pt;"> <div><b>From: </b>Patrice Roy</di=
v><div><b>Sent: </b>Friday, January 5, 2018 9:27 PM</div><div><b>To: </b>st=
d-proposals@isocpp.org</div><div><b>Reply To: </b>std-proposals@isocpp.org<=
/div><div><b>Subject: </b>Re: [std-proposals] Re: Structured Bindings - rev=
isited</div></div></td></tr></tbody></table><div style=3D"border-style: sol=
id none none; border-top-color: rgb(186, 188, 209); border-top-width: 1pt; =
font-size: initial; text-align: initial; background-color: rgb(255, 255, 25=
5);"></div><br><div id=3D"_originalContent" style=3D""><div dir=3D"ltr"><di=
v><div><div>FWIW, Richard, I think your idea has merits. I have often found=
it a bit annoying not to be able to declare variables of different types i=
n the init section of a for statement, and inspiration from lambda capture =
syntax / structured bindings seems harmonious to me.<br><br>Alternatives su=
ggested so far given the existing language would either force manually intr=
oducing a scope around the for loop, or accepting unnecessarily long lifeti=
mes for those additional variables; the first one is unpleasant (sort of a =
hack to get around a limitation), the second one is actually adverse to wha=
t would be an appropriate strategy for the management of those variables' l=
ifetimes. Neither is as satisfactory as your idea.<br><br></div>The initial=
ization par of the for(auto [a =3D 0, b =3D ""s]; a !=3D N; ++a) { /* ... *=
/ } form can be seen a emulating an implicit make_tuple as you are suggesti=
ng, or as initializing a and b from an anonymous struct of sorts. Either wo=
rks as a mental model for me, and the proposed syntax seems easier to teach=
and more elegant than what it would replace given that mental model. It's =
a syntax that, for someone who has played with structured bindings already,=
just seems very natural (in fact, to me, you just hit a '"why didn't I thi=
nk of it?" spot :) ).<br><br></div>Are you planning a paper for EWG with th=
is?<br><br></div>Thanks!<br><div><div> <br></div></div></div><d=
iv class=3D"gmail_extra"><br><div class=3D"gmail_quote">2017-12-16 11:06 GM=
T-05:00 <span dir=3D"ltr"><<a href=3D"mailto:adrian.hawryluk@gmail.com"=
target=3D"_blank">adrian.hawryluk@gmail.com</a>></span>:<br><blockquote=
class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><div dir=3D"ltr"><span class=3D""><br><br>On Thursday, =
December 14, 2017 at 12:19:47 PM UTC-5, Nicol Bolas wrote:</span><blockquot=
e class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px=
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><span class=3D"">On Thursday=
, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:</span><span =
class=3D""><div><blockquote class=3D"gmail_quote"><div style=3D"border-bott=
om-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(34,34,34);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px" dir=3D"ltr=
"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;=
border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:n=
one;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-st=
yle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px">I really do think that there is a case for allowing:</div>=
<div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bo=
rder-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-styl=
e:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-botto=
m-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border=
-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bor=
der-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);=
border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0p=
x;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddi=
ng-right:0px;padding-top:0px"><br></div><div style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border=
-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;colo=
r:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:=
0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pa=
dding-top:0px;white-space:pre-wrap"><font style=3D"border-bottom-color:rgb(=
0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-color:r=
gb(0,0,0);border-left-style:none;border-left-width:0px;border-right-color:r=
gb(0,0,0);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;marg=
in-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left=
:0px;padding-right:0px;padding-top:0px" face=3D"monospace, monospace"> =
; for(auto [i =3D std::size_t(<span style=3D"border-bottom-colo=
r:rgb(9,136,90);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(9,136,90);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(9,136,90);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(9,136,90);border-top-style:none;border-top-width:0px;colo=
r:rgb(9,136,90);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0p=
x">0</span>)] ; auto&& elem : v)</font></div><div style=3D"border-b=
ottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bo=
rder-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:=
rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px;white-space:pre-wrap"><div style=3D"border-bottom-color:rgb(0,0=
,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(=
0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px"><font style=3D"border-bottom-color:rgb=
(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:=
rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;mar=
gin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px" face=3D"monospace, monospace">&nbs=
p; f(elem, </fo=
nt><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;b=
order-bottom-width:0px;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:none=
;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;b=
order-top-width:0px;font-family:monospace,monospace;margin-bottom:0px;margi=
n-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:=
0px;padding-right:0px;padding-top:0px">i++)</span><span style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-fam=
ily:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px">;</span></div><div style=3D"border-bottom-color:rgb(0,0,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bo=
rder-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0);b=
order-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0=
);border-top-style:none;border-top-width:0px;font-family:monospace,monospac=
e;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span>=
</div></div></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bor=
der-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,3=
4);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,3=
4,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(34,34,34);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px">or:</div><div style=3D"bord=
er-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px=
;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:none;border-right-width:0p=
x;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;co=
lor:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px;white-space:pre-wrap"><font style=3D"border-bottom-color:rg=
b(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color=
:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px" face=3D"monospace, monospace"><br=
style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-=
right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-to=
p-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><=
/font></div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-styl=
e:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-st=
yle:none;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-size:14px;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px;white-space:pre-wrap"><font s=
tyle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-=
width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px" fac=
e=3D"monospace, monospace"> for(auto [i =3D std::size_t(<=
span style=3D"border-bottom-color:rgb(9,136,90);border-bottom-style:none;bo=
rder-bottom-width:0px;border-left-color:rgb(9,136,90);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(9,136,90);border-right-style=
:none;border-right-width:0px;border-top-color:rgb(9,136,90);border-top-styl=
e:none;border-top-width:0px;color:rgb(9,136,90);margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px">0</span>), first =3D begin(v), last =3D =
end(v)] ; first !=3D last ; ++first, ++i)</font></div><div style=3D"border-=
bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color=
:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px;white-space:pre-wrap"><div style=3D"border-bottom-color:rgb(0,=
0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb=
(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px"><font style=3D"border-bottom-color:rg=
b(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color=
:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px" face=3D"monospace, monospace">&nb=
sp; f(*first, <=
/font><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:non=
e;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:no=
ne;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:n=
one;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:non=
e;border-top-width:0px;font-family:monospace,monospace;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px">i)</span><span style=3D"border-bo=
ttom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-fa=
mily:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px">;</span></div><div style=3D"border-bottom-color:rgb(0,0,0);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0);=
border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,=
0);border-top-style:none;border-top-width:0px;font-family:monospace,monospa=
ce;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span>=
</div></div></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bo=
ttom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bor=
der-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);=
border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,3=
4);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,3=
4,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(34,34,34);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom=
-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">or:</div><di=
v style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;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:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px;white-space:pre-wrap"><font style=3D"border-=
bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margi=
n-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom=
:0px;padding-left:0px;padding-right:0px;padding-top:0px" face=3D"monospace,=
monospace"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"></font></div><div style=3D"border-bottom-color:rgb(0,0,0);bor=
der-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0);=
border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:14px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-space:pr=
e-wrap"><font style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:n=
one;border-bottom-width:0px;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=
:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:n=
one;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px" face=3D"monospace, monospace"> for(auto i =3D=
std::size_t(<span style=3D"border-bottom-color:rgb(9,136,90);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(9,136,90);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(9,136,90);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(9,136,90);b=
order-top-style:none;border-top-width:0px;color:rgb(9,136,90);margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px">0</span>), first =3D begin=
(v), last =3D end(v) ; first !=3D last ; ++first, ++i)</font></div><div sty=
le=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom=
-width:0px;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:none;border-righ=
t-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wi=
dth:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px;white-space:pre-wrap"><div style=3D"border-bottom=
-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-l=
eft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-ri=
ght-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-=
top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"><font style=3D"border-bo=
ttom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px" face=3D"monospace, m=
onospace">  =
; f(*first, </font><span style=3D"border-bottom-color:rgb(0,0,0);border-bot=
tom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-=
top-style:none;border-top-width:0px;font-family:monospace,monospace;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">i)</span><span style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px">;</span></div><div style=3D"border-bottom-color:rg=
b(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color=
:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px"><span style=3D"border-bottom-colo=
r:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-family:mono=
space,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0p=
x"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"></span></div></div></div></div><div style=3D"border-bottom-color:rgb(3=
4,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bot=
tom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(34,34,34);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:=
0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">since we =
already have this ability in the nasty lambda above, why not provide the ab=
ility in a way that's easy to reason about?</div></div></div></div></blockq=
uote><div><br></div><div>You can already do the first one; just get rid of =
the structured binding bit. And the second and third ones have nothing to d=
o with one another. They have completely different semantics.</div></div></=
span></div></blockquote><div><br></div><div>Um, I don't think you can do th=
e first one. Unless g++7.2.0 isn't complaint yet, the following snipp=
et will not comple:</div><div><br></div><div><span style=3D"white-space:pre=
-wrap"> </span>std::vector<int> v =3D {1,2,3,4};</div><div><span styl=
e=3D"white-space:pre-wrap"> </span>for(auto i=3D0; auto&& e : v)</d=
iv><div><span style=3D"white-space:pre-wrap"> </span>{</div><div><span styl=
e=3D"white-space:pre-wrap"> </span>std::cout << e << std::endl=
;</div><div><span style=3D"white-space:pre-wrap"> </span>}</div><div> =
</div><div><br></div></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-1d329631c6d8%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/7928=
cfe2-5779-4f69-<wbr>a1e4-1d329631c6d8%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups "=
ISO C++ Standard - Future Proposals" 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/CAKiZDp32jD8kxFL%2B3-gFePMRt7Xds8HO6N=
oWS_T%3DofaO3E539g%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoo=
ter">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp32=
jD8kxFL%2B3-gFePMRt7Xds8HO6NoWS_T%3DofaO3E539g%40mail.gmail.com</a>.<br>
<br><!--end of _originalContent --></div></body></html>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/20180106030305.5115986.4133.44006%40g=
mail.com?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.com/=
a/isocpp.org/d/msgid/std-proposals/20180106030305.5115986.4133.44006%40gmai=
l.com</a>.<br />
.
Author: Patrice Roy <patricer@gmail.com>
Date: Fri, 5 Jan 2018 23:38:42 -0500
Raw View
--001a1148ae1ece750e05621423c9
Content-Type: text/plain; charset="UTF-8"
Interesting addition to the discussion. I'll wait to see what for it takes,
though; Richard's suggestion blends in well with the existing set; it's not
offensive in the context of lambda captures and structured bindings, and
it's actually teachable. My guess (it's speculative, at this point) is that
syntactic upgrades brought upon by an eventual pattern matching proposal
being accepted will likely benefit all three, so relative homogeneity seems
to me to be the premium factor for the moment.
2018-01-05 22:03 GMT-05:00 Tony V E <tvaneerd@gmail.com>:
> We should also keep in mind that pattern matching will need an easy,
> unobtrusive way to declare variables. Even auto [ ] might be too much. It
> needs a single char like `x or something.
>
> Sent from my BlackBerry portable Babbage Device
> *From: *Patrice Roy
> *Sent: *Friday, January 5, 2018 9:27 PM
> *To: *std-proposals@isocpp.org
> *Reply To: *std-proposals@isocpp.org
> *Subject: *Re: [std-proposals] Re: Structured Bindings - revisited
>
> FWIW, Richard, I think your idea has merits. I have often found it a bit
> annoying not to be able to declare variables of different types in the init
> section of a for statement, and inspiration from lambda capture syntax /
> structured bindings seems harmonious to me.
>
> Alternatives suggested so far given the existing language would either
> force manually introducing a scope around the for loop, or accepting
> unnecessarily long lifetimes for those additional variables; the first one
> is unpleasant (sort of a hack to get around a limitation), the second one
> is actually adverse to what would be an appropriate strategy for the
> management of those variables' lifetimes. Neither is as satisfactory as
> your idea.
>
> The initialization par of the for(auto [a = 0, b = ""s]; a != N; ++a) { /*
> ... */ } form can be seen a emulating an implicit make_tuple as you are
> suggesting, or as initializing a and b from an anonymous struct of sorts.
> Either works as a mental model for me, and the proposed syntax seems easier
> to teach and more elegant than what it would replace given that mental
> model. It's a syntax that, for someone who has played with structured
> bindings already, just seems very natural (in fact, to me, you just hit a
> '"why didn't I think of it?" spot :) ).
>
> Are you planning a paper for EWG with this?
>
> Thanks!
>
>
> 2017-12-16 11:06 GMT-05:00 <adrian.hawryluk@gmail.com>:
>
>>
>>
>> On Thursday, December 14, 2017 at 12:19:47 PM UTC-5, Nicol Bolas wrote:
>>>
>>> On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:
>>>
>>>> I really do think that there is a case for allowing:
>>>>
>>>> for(auto [i = std::size_t(0)] ; auto&& elem : v)
>>>> f(elem, i++);
>>>>
>>>> or:
>>>>
>>>> for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ;
>>>> first != last ; ++first, ++i)
>>>> f(*first, i);
>>>>
>>>> or:
>>>>
>>>> for(auto i = std::size_t(0), first = begin(v), last = end(v) ;
>>>> first != last ; ++first, ++i)
>>>> f(*first, i);
>>>>
>>>> since we already have this ability in the nasty lambda above, why not
>>>> provide the ability in a way that's easy to reason about?
>>>>
>>>
>>> You can already do the first one; just get rid of the structured binding
>>> bit. And the second and third ones have nothing to do with one another.
>>> They have completely different semantics.
>>>
>>
>> Um, I don't think you can do the first one. Unless g++7.2.0 isn't
>> complaint yet, the following snippet will not comple:
>>
>> std::vector<int> v = {1,2,3,4};
>> for(auto i=0; auto&& e : v)
>> {
>> std::cout << e << std::endl;
>> }
>>
>>
>> --
>> 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/is
>> ocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-
>> 1d329631c6d8%40isocpp.org
>> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-1d329631c6d8%40isocpp.org?utm_medium=email&utm_source=footer>
>> .
>>
>
> --
> 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/CAKiZDp32jD8kxFL%
> 2B3-gFePMRt7Xds8HO6NoWS_T%3DofaO3E539g%40mail.gmail.com
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp32jD8kxFL%2B3-gFePMRt7Xds8HO6NoWS_T%3DofaO3E539g%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
> --
> 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/20180106030305.
> 5115986.4133.44006%40gmail.com
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/20180106030305.5115986.4133.44006%40gmail.com?utm_medium=email&utm_source=footer>
> .
>
--
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/CAKiZDp0E6SQ91ViCT6%2Bobi0apQ%2Boqp10p%2BFdZOM97D8_n0%2BuNw%40mail.gmail.com.
--001a1148ae1ece750e05621423c9
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Interesting addition to the discussion. I'll wait to s=
ee what for it takes, though; Richard's suggestion blends in well with =
the existing set; it's not offensive in the context of lambda captures =
and structured bindings, and it's actually teachable. My guess (it'=
s speculative, at this point) is that syntactic upgrades brought upon by an=
eventual pattern matching proposal being accepted will likely benefit all =
three, so relative homogeneity seems to me to be the premium factor for the=
moment.<br></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote"=
>2018-01-05 22:03 GMT-05:00 Tony V E <span dir=3D"ltr"><<a href=3D"mailt=
o:tvaneerd@gmail.com" target=3D"_blank">tvaneerd@gmail.com</a>></span>:<=
br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left=
:1px #ccc solid;padding-left:1ex"><div style=3D"background-color:rgb(255,25=
5,255);line-height:initial" lang=3D"en-US"> =
<div style=3D"width:1=
00%;font-size:initial;font-family:Calibri,'Slate Pro',sans-serif,sa=
ns-serif;color:rgb(31,73,125);text-align:initial;background-color:rgb(255,2=
55,255)">We should also keep in mind that pattern matching will need an eas=
y, unobtrusive way to declare variables. Even auto [ ] might be too much. I=
t needs a single char like `x or something. </div> =
=
<div style=3D"width:100%;font-size:initial=
;font-family:Calibri,'Slate Pro',sans-serif,sans-serif;color:rgb(31=
,73,125);text-align:initial;background-color:rgb(255,255,255)"><br style=3D=
"display:initial"></div> =
=
<div s=
tyle=3D"font-size:initial;font-family:Calibri,'Slate Pro',sans-seri=
f,sans-serif;color:rgb(31,73,125);text-align:initial;background-color:rgb(2=
55,255,255)">Sent=C2=A0from=C2=A0my=C2=A0BlackBerry=C2=A0<wbr>portable=C2=
=A0Babbage=C2=A0Device</div> =
=
<table style=3D"bac=
kground-color:white;border-spacing:0px" width=3D"100%"> <tbody><tr><td cols=
pan=3D"2" style=3D"font-size:initial;text-align:initial;background-color:rg=
b(255,255,255)"> <div style=3D"border-style:solid=
none none;border-top-color:rgb(181,196,223);border-top-width:1pt;padding:3=
pt 0in 0in;font-family:Tahoma,'BB Alpha Sans','Slate Pro';f=
ont-size:10pt"> <div><b>From: </b>Patrice Roy</div><div><b>Sent: </b>Frida=
y, January 5, 2018 9:27 PM</div><div><b>To: </b><a href=3D"mailto:std-propo=
sals@isocpp.org" target=3D"_blank">std-proposals@isocpp.org</a></div><div><=
b>Reply To: </b><a href=3D"mailto:std-proposals@isocpp.org" target=3D"_blan=
k">std-proposals@isocpp.org</a></div><div><b>Subject: </b>Re: [std-proposal=
s] Re: Structured Bindings - revisited</div></div></td></tr></tbody></table=
><div style=3D"border-style:solid none none;border-top-color:rgb(186,188,20=
9);border-top-width:1pt;font-size:initial;text-align:initial;background-col=
or:rgb(255,255,255)"></div><br><div id=3D"m_7337472280494656079_originalCon=
tent"><div><div class=3D"h5"><div dir=3D"ltr"><div><div><div>FWIW, Richard,=
I think your idea has merits. I have often found it a bit annoying not to =
be able to declare variables of different types in the init section of a fo=
r statement, and inspiration from lambda capture syntax / structured bindin=
gs seems harmonious to me.<br><br>Alternatives suggested so far given the e=
xisting language would either force manually introducing a scope around the=
for loop, or accepting unnecessarily long lifetimes for those additional v=
ariables; the first one is unpleasant (sort of a hack to get around a limit=
ation), the second one is actually adverse to what would be an appropriate =
strategy for the management of those variables' lifetimes. Neither is a=
s satisfactory as your idea.<br><br></div>The initialization par of the for=
(auto [a =3D 0, b =3D ""s]; a !=3D N; ++a) { /* ... */ } form can=
be seen a emulating an implicit make_tuple as you are suggesting, or as in=
itializing a and b from an anonymous struct of sorts. Either works as a men=
tal model for me, and the proposed syntax seems easier to teach and more el=
egant than what it would replace given that mental model. It's a syntax=
that, for someone who has played with structured bindings already, just se=
ems very natural (in fact, to me, you just hit a '"why didn't =
I think of it?" spot :) ).<br><br></div>Are you planning a paper for E=
WG with this?<br><br></div>Thanks!<br><div><div>=C2=A0=C2=A0 <br></div></di=
v></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">2017-12-1=
6 11:06 GMT-05:00 <span dir=3D"ltr"><<a href=3D"mailto:adrian.hawryluk@=
gmail.com" target=3D"_blank">adrian.hawryluk@gmail.com</a>></span>:<br><=
blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px=
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><span><br><br>On Thursday, D=
ecember 14, 2017 at 12:19:47 PM UTC-5, Nicol Bolas wrote:</span><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"><span>On Thursday, December 1=
4, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:</span><span><div><blockq=
uote class=3D"gmail_quote"><div style=3D"border-bottom-color:rgb(34,34,34);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,3=
4,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(3=
4,34,34);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px" dir=3D"ltr"><div style=3D"border-=
bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wi=
dth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wid=
th:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">I real=
ly do think that there is a case for allowing:</div><div style=3D"border-bo=
ttom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(34,34,34);border-right-style:none;border-right-widt=
h:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width=
:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div sty=
le=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;b=
order-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px"><br></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bot=
tom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);bord=
er-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34=
);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(0,0,0=
);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,=
0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:=
14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-spa=
ce:pre-wrap"><font style=3D"border-bottom-color:rgb(0,0,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-st=
yle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0 for(auto =
[i =3D std::size_t(<span style=3D"border-bottom-color:rgb(9,136,90);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(9,136,90);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(9,136,90=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(9,136=
,90);border-top-style:none;border-top-width:0px;color:rgb(9,136,90);margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">0</span>)] ; auto&am=
p;& elem : v)</font></div><div style=3D"border-bottom-color:rgb(0,0,0);=
border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,=
0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:14=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-space=
:pre-wrap"><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-sty=
le:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"><font style=3D"border-bottom-color:rgb(0,0,0);border-bottom-s=
tyle:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-s=
tyle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-rig=
ht:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px=
;padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(elem, </font><span style=3D"borde=
r-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;fon=
t-family:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right=
:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;p=
adding-top:0px">i++)</span><span style=3D"border-bottom-color:rgb(0,0,0);bo=
rder-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0)=
;border-top-style:none;border-top-width:0px;font-family:monospace,monospace=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">;</span></di=
v><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none=
;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none=
;border-top-width:0px;font-family:monospace,monospace;margin-bottom:0px;mar=
gin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:r=
gb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px"></span></div></div></div><div st=
yle=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-=
top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margi=
n-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-righ=
t:0px;padding-top:0px">or:</div><div style=3D"border-bottom-color:rgb(0,0,0=
);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,=
0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:=
14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-spa=
ce:pre-wrap"><font style=3D"border-bottom-color:rgb(0,0,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-st=
yle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px" face=3D"monospace, monospace"><br style=3D"border-bottom-c=
olor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-lef=
t-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-to=
p-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px"></font></div><div style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;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:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin=
-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right=
:0px;padding-top:0px;white-space:pre-wrap"><font style=3D"border-bottom-col=
or:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-=
color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px" face=3D"monospace, monospace=
">=C2=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<span style=3D"border-bott=
om-color:rgb(9,136,90);border-bottom-style:none;border-bottom-width:0px;bor=
der-left-color:rgb(9,136,90);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(9,136,90);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(9,136,90);border-top-style:none;border-top-width:0=
px;color:rgb(9,136,90);margin-bottom:0px;margin-left:0px;margin-right:0px;m=
argin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding=
-top:0px">0</span>), first =3D begin(v), last =3D end(v)] ; first !=3D last=
; ++first, ++i)</font></div><div style=3D"border-bottom-color:rgb(0,0,0);b=
order-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0=
);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:14p=
x;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-space:=
pre-wrap"><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:=
none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-styl=
e:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:=
none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"><font style=3D"border-bottom-color:rgb(0,0,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-st=
yle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><span style=3D"bor=
der-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0p=
x;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:none;border-right-width:0=
px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;f=
ont-family:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-rig=
ht:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px=
;padding-top:0px">i)</span><span style=3D"border-bottom-color:rgb(0,0,0);bo=
rder-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0)=
;border-top-style:none;border-top-width:0px;font-family:monospace,monospace=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">;</span></di=
v><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none=
;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:non=
e;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none=
;border-top-width:0px;font-family:monospace,monospace;margin-bottom:0px;mar=
gin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:r=
gb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-colo=
r:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-colo=
r:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-l=
eft:0px;padding-right:0px;padding-top:0px"></span></div></div></div><div st=
yle=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style=
:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-=
top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margi=
n-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-righ=
t:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34=
,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(34=
,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px">or:</div><div style=3D"border-bottom-=
color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,=
0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px;white-space:pre-wrap"><font style=3D"border-bottom-color:rgb(0,0,0);b=
order-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0=
);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px" face=3D"monospace, monospace"><br style=3D"=
border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width=
:0px;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:none;border-right-widt=
h:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0p=
x;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding=
-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></font></di=
v><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px;white-space:pre-wrap"><font style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px" face=3D"monos=
pace, monospace">=C2=A0=C2=A0=C2=A0 for(auto i =3D std::size_t(<span style=
=3D"border-bottom-color:rgb(9,136,90);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(9,136,90);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(9,136,90);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(9,136,90);border-top-style:none;bor=
der-top-width:0px;color:rgb(9,136,90);margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px">0</span>), first =3D begin(v), last =3D end(v) ; f=
irst !=3D last ; ++first, ++i)</font></div><div style=3D"border-bottom-colo=
r:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0)=
;font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0p=
x;white-space:pre-wrap"><div style=3D"border-bottom-color:rgb(0,0,0);border=
-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bor=
der-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bor=
der-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bor=
der-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;m=
argin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-=
right:0px;padding-top:0px"><font style=3D"border-bottom-color:rgb(0,0,0);bo=
rder-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0)=
;border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0=
px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padd=
ing-right:0px;padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><sp=
an style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-=
bottom-width:0px;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:none;borde=
r-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-=
top-width:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">i)</span><span style=3D"border-bottom-colo=
r:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-family:mono=
space,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0p=
x">;</span></div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top=
-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bo=
ttom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0);border=
-top-style:none;border-top-width:0px;font-family:monospace,monospace;margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border=
-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"></span></div></di=
v></div></div><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34=
,34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(34,34,34);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px">since we already have this abil=
ity in the nasty lambda above, why not provide the ability in a way that=
9;s easy to reason about?</div></div></div></div></blockquote><div><br></di=
v><div>You can already do the first one; just get rid of the structured bin=
ding bit. And the second and third ones have nothing to do with one another=
.. They have completely different semantics.</div></div></span></div></block=
quote><div><br></div><div>Um, I don't think you can do the first one.=
=C2=A0 Unless g++7.2.0 isn't complaint yet, the following snippet will =
not comple:</div><div><br></div><div><span style=3D"white-space:pre-wrap"> =
</span>std::vector<int> v =3D {1,2,3,4};</div><div><span style=3D"whi=
te-space:pre-wrap"> </span>for(auto i=3D0; auto&& e : v)</div><div>=
<span style=3D"white-space:pre-wrap"> </span>{</div><div><span style=3D"whi=
te-space:pre-wrap"> </span>std::cout << e << std::endl;</div><=
div><span style=3D"white-space:pre-wrap"> </span>}</div><div>=C2=A0</div><d=
iv><br></div></div><span>
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@isoc<wbr>pp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-1d329631c6d8%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/is<wbr>ocpp.org/d/msgid/std-proposals<wbr>/7928=
cfe2-5779-4f69-a1e4-<wbr>1d329631c6d8%40isocpp.org</a>.<br>
</blockquote></div><br></div>
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></div></div>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CAKiZDp32jD8kxFL%2B3-gFePMRt7Xds8HO6N=
oWS_T%3DofaO3E539g%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoo=
ter" target=3D"_blank">https://groups.google.com/a/<wbr>isocpp.org/d/msgid/=
std-<wbr>proposals/CAKiZDp32jD8kxFL%<wbr>2B3-gFePMRt7Xds8HO6NoWS_T%<wbr>3Do=
faO3E539g%40mail.gmail.com</a>.<br>
<br></div></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/20180106030305.5115986.4133.44006%40g=
mail.com?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">http=
s://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/20180106=
030305.<wbr>5115986.4133.44006%40gmail.com</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp0E6SQ91ViCT6%2Bobi0apQ%2Boqp10=
p%2BFdZOM97D8_n0%2BuNw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoo=
ter">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp0E=
6SQ91ViCT6%2Bobi0apQ%2Boqp10p%2BFdZOM97D8_n0%2BuNw%40mail.gmail.com</a>.<br=
/>
--001a1148ae1ece750e05621423c9--
.
Author: Richard Hodges <hodges.r@gmail.com>
Date: Sat, 6 Jan 2018 08:24:59 +0100
Raw View
--001a11448920848cc2056216764e
Content-Type: text/plain; charset="UTF-8"
> FWIW, Richard, I think your idea has merits. I have often found it a bit
annoying not to be able to declare variables of different types in the init
section of a for statement, and inspiration from lambda capture syntax /
structured bindings seems harmonious to me.
> Are you planning a paper for EWG with this?
At the end of last year I voiced a few ideas in this forum and
std-proposals, based on my experiences and frustrations in 25 years of
writing c++.
To be honest, I found the reception somewhat unwelcoming, and I have a busy
job in a small firm, so decided to put my efforts elsewhere.
Happy to revisit when things calm down for me, if there is genuine interest.
On 6 January 2018 at 03:27, Patrice Roy <patricer@gmail.com> wrote:
> FWIW, Richard, I think your idea has merits. I have often found it a bit
> annoying not to be able to declare variables of different types in the init
> section of a for statement, and inspiration from lambda capture syntax /
> structured bindings seems harmonious to me.
>
> Alternatives suggested so far given the existing language would either
> force manually introducing a scope around the for loop, or accepting
> unnecessarily long lifetimes for those additional variables; the first one
> is unpleasant (sort of a hack to get around a limitation), the second one
> is actually adverse to what would be an appropriate strategy for the
> management of those variables' lifetimes. Neither is as satisfactory as
> your idea.
>
> The initialization par of the for(auto [a = 0, b = ""s]; a != N; ++a) { /*
> ... */ } form can be seen a emulating an implicit make_tuple as you are
> suggesting, or as initializing a and b from an anonymous struct of sorts.
> Either works as a mental model for me, and the proposed syntax seems easier
> to teach and more elegant than what it would replace given that mental
> model. It's a syntax that, for someone who has played with structured
> bindings already, just seems very natural (in fact, to me, you just hit a
> '"why didn't I think of it?" spot :) ).
>
> Are you planning a paper for EWG with this?
>
> Thanks!
>
>
> 2017-12-16 11:06 GMT-05:00 <adrian.hawryluk@gmail.com>:
>
>>
>>
>> On Thursday, December 14, 2017 at 12:19:47 PM UTC-5, Nicol Bolas wrote:
>>>
>>> On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:
>>>
>>>> I really do think that there is a case for allowing:
>>>>
>>>> for(auto [i = std::size_t(0)] ; auto&& elem : v)
>>>> f(elem, i++);
>>>>
>>>> or:
>>>>
>>>> for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ;
>>>> first != last ; ++first, ++i)
>>>> f(*first, i);
>>>>
>>>> or:
>>>>
>>>> for(auto i = std::size_t(0), first = begin(v), last = end(v) ;
>>>> first != last ; ++first, ++i)
>>>> f(*first, i);
>>>>
>>>> since we already have this ability in the nasty lambda above, why not
>>>> provide the ability in a way that's easy to reason about?
>>>>
>>>
>>> You can already do the first one; just get rid of the structured binding
>>> bit. And the second and third ones have nothing to do with one another.
>>> They have completely different semantics.
>>>
>>
>> Um, I don't think you can do the first one. Unless g++7.2.0 isn't
>> complaint yet, the following snippet will not comple:
>>
>> std::vector<int> v = {1,2,3,4};
>> for(auto i=0; auto&& e : v)
>> {
>> std::cout << e << std::endl;
>> }
>>
>>
>> --
>> 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/is
>> ocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-
>> 1d329631c6d8%40isocpp.org
>> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-1d329631c6d8%40isocpp.org?utm_medium=email&utm_source=footer>
>> .
>>
>
> --
> 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/CAKiZDp32jD8kxFL%
> 2B3-gFePMRt7Xds8HO6NoWS_T%3DofaO3E539g%40mail.gmail.com
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp32jD8kxFL%2B3-gFePMRt7Xds8HO6NoWS_T%3DofaO3E539g%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
--
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/CALvx3hbYc9h1du%2BAuwNmi%2B_iOZmtCh_MUWEA0i6qOM_GKh2zXQ%40mail.gmail.com.
--001a11448920848cc2056216764e
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div style=3D"font-size:12.8px"><div>> FWIW, Richard, I=
think your idea has merits. I have often found it a bit annoying not to be=
able to declare variables of different types in the init section of a for =
statement, and inspiration from lambda capture syntax / structured bindings=
seems harmonious to me.<br><br></div></div><span style=3D"font-size:12.8px=
">> Are you planning a paper for EWG with this?</span><br style=3D"font-=
size:12.8px"><div><span style=3D"font-size:12.8px"><br></span></div><div><s=
pan style=3D"font-size:12.8px">At the end of last year I voiced a few ideas=
in this forum and std-proposals, based on my experiences and frustrations =
in 25 years of writing c++.</span></div><div><span style=3D"font-size:12.8p=
x"><br></span></div><div><span style=3D"font-size:12.8px">To be honest, I f=
ound the reception somewhat unwelcoming, and I have a busy job in a small f=
irm, so decided to put my efforts elsewhere.=C2=A0</span></div><div><span s=
tyle=3D"font-size:12.8px"><br></span></div><div><span style=3D"font-size:12=
..8px">Happy to revisit when things calm down for me, if there is genuine in=
terest.</span></div><div><span style=3D"font-size:12.8px"><br></span></div>=
<div><br></div></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">On 6 January 2018 at 03:27, Patrice Roy <span dir=3D"ltr"><<a href=
=3D"mailto:patricer@gmail.com" target=3D"_blank">patricer@gmail.com</a>>=
</span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .=
8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div=
><div>FWIW, Richard, I think your idea has merits. I have often found it a =
bit annoying not to be able to declare variables of different types in the =
init section of a for statement, and inspiration from lambda capture syntax=
/ structured bindings seems harmonious to me.<br><br>Alternatives suggeste=
d so far given the existing language would either force manually introducin=
g a scope around the for loop, or accepting unnecessarily long lifetimes fo=
r those additional variables; the first one is unpleasant (sort of a hack t=
o get around a limitation), the second one is actually adverse to what woul=
d be an appropriate strategy for the management of those variables' lif=
etimes. Neither is as satisfactory as your idea.<br><br></div>The initializ=
ation par of the for(auto [a =3D 0, b =3D ""s]; a !=3D N; ++a) { =
/* ... */ } form can be seen a emulating an implicit make_tuple as you are =
suggesting, or as initializing a and b from an anonymous struct of sorts. E=
ither works as a mental model for me, and the proposed syntax seems easier =
to teach and more elegant than what it would replace given that mental mode=
l. It's a syntax that, for someone who has played with structured bindi=
ngs already, just seems very natural (in fact, to me, you just hit a '&=
quot;why didn't I think of it?" spot :) ).<br><br></div>Are you pl=
anning a paper for EWG with this?<br><br></div>Thanks!<br><div><div>=C2=A0=
=C2=A0 <br></div></div></div><div><div class=3D"h5"><div class=3D"gmail_ext=
ra"><br><div class=3D"gmail_quote">2017-12-16 11:06 GMT-05:00 <span dir=3D=
"ltr"><<a href=3D"mailto:adrian.hawryluk@gmail.com" target=3D"_blank">ad=
rian.hawryluk@gmail.com</a>></span>:<br><blockquote class=3D"gmail_quote=
" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><=
div dir=3D"ltr"><span><br><br>On Thursday, December 14, 2017 at 12:19:47 PM=
UTC-5, Nicol Bolas wrote:</span><blockquote class=3D"gmail_quote" style=3D=
"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><d=
iv dir=3D"ltr"><span>On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Ri=
chard Hodges wrote:</span><span><div><blockquote class=3D"gmail_quote"><div=
style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:no=
ne;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px" dir=3D"ltr"><div style=3D"border-bottom-color:rgb(34,34,34);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34=
);border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34=
,34);border-right-style:none;border-right-width:0px;border-top-color:rgb(34=
,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px">I really do think that there is a cas=
e for allowing:</div><div style=3D"border-bottom-color:rgb(34,34,34);border=
-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);=
border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,3=
4);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,3=
4,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(3=
4,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"><br></div><div style=3D"=
border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wi=
dth:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-=
width:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-r=
ight-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-=
top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top=
:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"=
><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bord=
er-top-width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px;white-space:pre-wrap"><font style=3D"bor=
der-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0p=
x;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:none;border-right-width:0=
px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px" face=3D"monosp=
ace, monospace">=C2=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<span style=
=3D"border-bottom-color:rgb(9,136,90);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(9,136,90);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(9,136,90);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(9,136,90);border-top-style:none;bor=
der-top-width:0px;color:rgb(9,136,90);margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px">0</span>)] ; auto&& elem : v)</font></div>=
<div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;borde=
r-top-width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px;white-space:pre-wrap"><div style=3D"borde=
r-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;b=
order-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px"><font style=3D"b=
order-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px" face=3D"mono=
space, monospace">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 f(elem, </font><span style=3D"border-bottom-color:rgb(0,0,0);bord=
er-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);b=
order-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);b=
order-top-style:none;border-top-width:0px;font-family:monospace,monospace;m=
argin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bo=
ttom:0px;padding-left:0px;padding-right:0px;padding-top:0px">i++)</span><sp=
an style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-=
bottom-width:0px;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:none;borde=
r-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-=
top-width:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">;</span></div><div style=3D"border-bottom-=
color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"><span style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-fam=
ily:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:=
none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-styl=
e:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:=
none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"></span></div></div></div><div style=3D"border-bottom-color:rgb=
(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-=
color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">or:</di=
v><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bor=
der-top-width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px;white-space:pre-wrap"><font style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px" face=3D"monos=
pace, monospace"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left=
-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-righ=
t-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-=
style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px"></font></div><div style=3D"border-bottom-color:rgb(0,0,0=
);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,=
0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:=
14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padd=
ing-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-spa=
ce:pre-wrap"><font style=3D"border-bottom-color:rgb(0,0,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-st=
yle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0 for(auto =
[i =3D std::size_t(<span style=3D"border-bottom-color:rgb(9,136,90);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(9,136,90);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(9,136,90=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(9,136=
,90);border-top-style:none;border-top-width:0px;color:rgb(9,136,90);margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">0</span>), first =3D=
begin(v), last =3D end(v)] ; first !=3D last ; ++first, ++i)</font></div><=
div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border=
-top-width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px;white-space:pre-wrap"><div style=3D"border=
-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;bo=
rder-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;=
border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-botto=
m:0px;padding-left:0px;padding-right:0px;padding-top:0px"><font style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-b=
ottom:0px;padding-left:0px;padding-right:0px;padding-top:0px" face=3D"monos=
pace, monospace">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 f(*first, </font><span style=3D"border-bottom-color:rgb(0,0,0);bo=
rder-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0)=
;border-top-style:none;border-top-width:0px;font-family:monospace,monospace=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">i)</span><sp=
an style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-=
bottom-width:0px;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:none;borde=
r-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-=
top-width:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left=
:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pa=
dding-right:0px;padding-top:0px">;</span></div><div style=3D"border-bottom-=
color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"><span style=3D"border-bot=
tom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bord=
er-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-fam=
ily:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:=
none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-styl=
e:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:=
none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0p=
x;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padd=
ing-top:0px"></span></div></div></div><div style=3D"border-bottom-color:rgb=
(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-col=
or:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-=
color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bo=
ttom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px=
;padding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><div st=
yle=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px">or:</div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-rig=
ht-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top=
-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:14px;margin-bot=
tom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px;white-space:pre-wrap"><f=
ont style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border=
-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-to=
p:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px=
" face=3D"monospace, monospace"><br style=3D"border-bottom-color:rgb(0,0,0)=
;border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0=
,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px"></font></div><div style=3D"border-bottom-=
color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,=
0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px;white-space:pre-wrap"><font style=3D"border-bottom-color:rgb(0,0,0);b=
order-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0,0=
);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px" face=3D"monospace, monospace">=C2=A0=C2=A0=
=C2=A0 for(auto i =3D std::size_t(<span style=3D"border-bottom-color:rgb(9,=
136,90);border-bottom-style:none;border-bottom-width:0px;border-left-color:=
rgb(9,136,90);border-left-style:none;border-left-width:0px;border-right-col=
or:rgb(9,136,90);border-right-style:none;border-right-width:0px;border-top-=
color:rgb(9,136,90);border-top-style:none;border-top-width:0px;color:rgb(9,=
136,90);margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">0</sp=
an>), first =3D begin(v), last =3D end(v) ; first !=3D last ; ++first, ++i)=
</font></div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-sty=
le:none;border-top-width:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px;white-space:pre-wrap"><div s=
tyle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bott=
om-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-lef=
t-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-=
width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><fo=
nt style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-=
bottom-width:0px;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:none;borde=
r-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-=
top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top=
:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"=
face=3D"monospace, monospace">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><span style=3D"border-bottom-colo=
r:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-family:mono=
space,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0p=
x">i)</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-sty=
le:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-st=
yle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-sty=
le:none;border-top-width:0px;font-family:monospace,monospace;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px">;</span></div><div style=3D=
"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-widt=
h:0px;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:none;border-right-wid=
th:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0=
px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddin=
g-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><span styl=
e=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-=
width:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right=
-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wid=
th:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bo=
rder-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;=
margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding=
-right:0px;padding-top:0px"></span></div></div></div></div><div style=3D"bo=
rder-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-to=
p-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><=
div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px">since we already have this ability in the nasty lambda above,=
why not provide the ability in a way that's easy to reason about?</div=
></div></div></div></blockquote><div><br></div><div>You can already do the =
first one; just get rid of the structured binding bit. And the second and t=
hird ones have nothing to do with one another. They have completely differe=
nt semantics.</div></div></span></div></blockquote><div><br></div><div>Um, =
I don't think you can do the first one.=C2=A0 Unless g++7.2.0 isn't=
complaint yet, the following snippet will not comple:</div><div><br></div>=
<div><span style=3D"white-space:pre-wrap"> </span>std::vector<int> v =
=3D {1,2,3,4};</div><div><span style=3D"white-space:pre-wrap"> </span>for(a=
uto i=3D0; auto&& e : v)</div><div><span style=3D"white-space:pre-w=
rap"> </span>{</div><div><span style=3D"white-space:pre-wrap"> </span>std:=
:cout << e << std::endl;</div><div><span style=3D"white-space:p=
re-wrap"> </span>}</div><div>=C2=A0</div><div><br></div></div><span>
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@isoc<wbr>pp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/7928cfe2-5779-4f69-a1e4-1d329631c6d8%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/is<wbr>ocpp.org/d/msgid/std-proposals<wbr>/7928=
cfe2-5779-4f69-a1e4-<wbr>1d329631c6d8%40isocpp.org</a>.<br>
</blockquote></div><br></div>
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></div></div>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CAKiZDp32jD8kxFL%2B3-gFePMRt7Xds8HO6N=
oWS_T%3DofaO3E539g%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoo=
ter" target=3D"_blank">https://groups.google.com/a/<wbr>isocpp.org/d/msgid/=
std-<wbr>proposals/CAKiZDp32jD8kxFL%<wbr>2B3-gFePMRt7Xds8HO6NoWS_T%<wbr>3Do=
faO3E539g%40mail.gmail.com</a>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CALvx3hbYc9h1du%2BAuwNmi%2B_iOZmtCh_M=
UWEA0i6qOM_GKh2zXQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CALvx3hbYc9h1=
du%2BAuwNmi%2B_iOZmtCh_MUWEA0i6qOM_GKh2zXQ%40mail.gmail.com</a>.<br />
--001a11448920848cc2056216764e--
.
Author: Nicolas Lesser <blitzrakete@gmail.com>
Date: Sat, 6 Jan 2018 02:47:13 -0800 (PST)
Raw View
------=_Part_8044_252057806.1515235633927
Content-Type: multipart/alternative;
boundary="----=_Part_8045_1057829637.1515235633927"
------=_Part_8045_1057829637.1515235633927
Content-Type: text/plain; charset="UTF-8"
On Saturday, December 16, 2017 at 5:06:21 PM UTC+1, Jack Adrian Zappa wrote:
>
>
>
> On Thursday, December 14, 2017 at 12:19:47 PM UTC-5, Nicol Bolas wrote:
>>
>> On Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:
>>
>>> I really do think that there is a case for allowing:
>>>
>>> for(auto [i = std::size_t(0)] ; auto&& elem : v)
>>> f(elem, i++);
>>>
>>> or:
>>>
>>> for(auto [i = std::size_t(0), first = begin(v), last = end(v)] ;
>>> first != last ; ++first, ++i)
>>> f(*first, i);
>>>
>>> or:
>>>
>>> for(auto i = std::size_t(0), first = begin(v), last = end(v) ;
>>> first != last ; ++first, ++i)
>>> f(*first, i);
>>>
>>> since we already have this ability in the nasty lambda above, why not
>>> provide the ability in a way that's easy to reason about?
>>>
>>
>> You can already do the first one; just get rid of the structured binding
>> bit. And the second and third ones have nothing to do with one another.
>> They have completely different semantics.
>>
>
> Um, I don't think you can do the first one. Unless g++7.2.0 isn't
> complaint yet, the following snippet will not comple:
>
> std::vector<int> v = {1,2,3,4};
> for(auto i=0; auto&& e : v)
> {
> std::cout << e << std::endl;
> }
>
You can, just not in C++17. This change was approved at the last meeting,
and was merged in the draft C++20 standard.
--
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/8bf4ac7b-4c21-4bf1-95ed-c92124065bed%40isocpp.org.
------=_Part_8045_1057829637.1515235633927
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Saturday, December 16, 2017 at 5:06:21 PM UTC+1=
, Jack Adrian Zappa 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 Thursday, December 14, 2017 at 12:19:47 PM UTC-5, N=
icol Bolas 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">O=
n Thursday, December 14, 2017 at 2:27:39 AM UTC-5, Richard Hodges wrote:<di=
v><blockquote class=3D"gmail_quote"><div style=3D"border-bottom-color:rgb(3=
4,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px" dir=3D"ltr"><div style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px">I really do think that there is a case for allowing:</div><div style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top=
-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px"><br></div><div style=3D"border-bottom-color:rgb(34,34,3=
4);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(3=
4,34,34);border-left-style:none;border-left-width:0px;border-right-color:rg=
b(34,34,34);border-right-style:none;border-right-width:0px;border-top-color=
:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px=
;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding=
-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-co=
lor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top=
-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,=
0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px;white-space:pre"><font face=3D"monospace, monospace" style=3D"border-bo=
ttom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;bord=
er-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;borde=
r-right-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;bor=
der-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px">=C2=A0=C2=A0=C2=A0 f=
or(auto [i =3D std::size_t(<span style=3D"border-bottom-color:rgb(9,136,90)=
;border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(9,1=
36,90);border-left-style:none;border-left-width:0px;border-right-color:rgb(=
9,136,90);border-right-style:none;border-right-width:0px;border-top-color:r=
gb(9,136,90);border-top-style:none;border-top-width:0px;color:rgb(9,136,90)=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">0</span>)] ;=
auto&& elem : v)</font></div><div style=3D"border-bottom-color:rgb=
(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:=
rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font=
-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;whi=
te-space:pre"><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-s=
tyle:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-st=
yle:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-righ=
t:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;=
padding-top:0px"><font face=3D"monospace, monospace" style=3D"border-bottom=
-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-l=
eft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-ri=
ght-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-=
top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px">=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(elem, </font><span style=3D"bo=
rder-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0=
px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width:=
0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;=
font-family:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px">i++)</span><span style=3D"border-bottom-color:rgb(0,0,0)=
;border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0=
,0);border-top-style:none;border-top-width:0px;font-family:monospace,monosp=
ace;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">;</span><=
/div><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;=
border-bottom-width:0px;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-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"><span style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:n=
one;border-bottom-width:0px;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=
:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:n=
one;border-top-width:0px;font-family:monospace,monospace;margin-bottom:0px;=
margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-=
left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-colo=
r:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-c=
olor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0p=
x;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddin=
g-left:0px;padding-right:0px;padding-top:0px"></span></div></div></div><div=
style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border=
-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bo=
rder-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:non=
e;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:no=
ne;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;=
margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddin=
g-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-st=
yle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-lef=
t-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-=
right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bord=
er-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;ma=
rgin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-r=
ight:0px;padding-top:0px">or:</div><div style=3D"border-bottom-color:rgb(0,=
0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb=
(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-si=
ze:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-=
space:pre"><font face=3D"monospace, monospace" style=3D"border-bottom-color=
:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-left-co=
lor:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px=
;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding=
-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-col=
or:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-=
color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0=
px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;paddi=
ng-left:0px;padding-right:0px;padding-top:0px"></font></div><div style=3D"b=
order-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:=
0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px=
;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px;white-space:pre"><font face=3D"monospace, monospace" sty=
le=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom=
-width:0px;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:none;border-righ=
t-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-wi=
dth:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;p=
adding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=C2=
=A0=C2=A0=C2=A0 for(auto [i =3D std::size_t(<span style=3D"border-bottom-co=
lor:rgb(9,136,90);border-bottom-style:none;border-bottom-width:0px;border-l=
eft-color:rgb(9,136,90);border-left-style:none;border-left-width:0px;border=
-right-color:rgb(9,136,90);border-right-style:none;border-right-width:0px;b=
order-top-color:rgb(9,136,90);border-top-style:none;border-top-width:0px;co=
lor:rgb(9,136,90);margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px">0</span>), first =3D begin(v), last =3D end(v)] ; first !=3D last ; ++=
first, ++i)</font></div><div style=3D"border-bottom-color:rgb(0,0,0);border=
-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bor=
der-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bor=
der-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bor=
der-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:14px;mar=
gin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bott=
om:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-space:pre">=
<div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bor=
der-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;borde=
r-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0p=
x"><font face=3D"monospace, monospace" style=3D"border-bottom-color:rgb(0,0=
,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(=
0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-=
left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><span style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-famil=
y:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;ma=
rgin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-=
top:0px">i)</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-t=
op-style:none;border-top-width:0px;font-family:monospace,monospace;margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px">;</span></div><div st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;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:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><spa=
n style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;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:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0)=
;border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0=
,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px"></span></div></div></div><div style=3D"bo=
rder-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-widt=
h:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-rig=
ht-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-to=
p-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><=
div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;bor=
der-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none=
;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:=
none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style=
:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0=
px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;pad=
ding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom=
-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-=
left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);bord=
er-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);b=
order-top-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px=
;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;paddin=
g-right:0px;padding-top:0px">or:</div><div style=3D"border-bottom-color:rgb=
(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:=
rgb(0,0,0);border-top-style:none;border-top-width:0px;color:rgb(0,0,0);font=
-size:14px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0p=
x;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px;whi=
te-space:pre"><font face=3D"monospace, monospace" style=3D"border-bottom-co=
lor:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top=
-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-=
color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-le=
ft-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border-t=
op-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;margin-botto=
m:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pa=
dding-left:0px;padding-right:0px;padding-top:0px"></font></div><div style=
=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-bottom-w=
idth:0px;border-left-color:rgb(0,0,0);border-left-style:none;border-left-wi=
dth:0px;border-right-color:rgb(0,0,0);border-right-style:none;border-right-=
width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-widt=
h:0px;color:rgb(0,0,0);font-size:14px;margin-bottom:0px;margin-left:0px;mar=
gin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-ri=
ght:0px;padding-top:0px;white-space:pre"><font face=3D"monospace, monospace=
" style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;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:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:=
0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
=C2=A0=C2=A0=C2=A0 for(auto i =3D std::size_t(<span style=3D"border-bottom-=
color:rgb(9,136,90);border-bottom-style:none;border-bottom-width:0px;border=
-left-color:rgb(9,136,90);border-left-style:none;border-left-width:0px;bord=
er-right-color:rgb(9,136,90);border-right-style:none;border-right-width:0px=
;border-top-color:rgb(9,136,90);border-top-style:none;border-top-width:0px;=
color:rgb(9,136,90);margin-bottom:0px;margin-left:0px;margin-right:0px;marg=
in-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-to=
p:0px">0</span>), first =3D begin(v), last =3D end(v) ; first !=3D last ; +=
+first, ++i)</font></div><div style=3D"border-bottom-color:rgb(0,0,0);borde=
r-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);bo=
rder-left-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);bo=
rder-right-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);bo=
rder-top-style:none;border-top-width:0px;color:rgb(0,0,0);font-size:14px;ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bot=
tom:0px;padding-left:0px;padding-right:0px;padding-top:0px;white-space:pre"=
><div style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;bord=
er-bottom-width:0px;border-left-color:rgb(0,0,0);border-left-style:none;bor=
der-left-width:0px;border-right-color:rgb(0,0,0);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;bord=
er-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0=
px"><font face=3D"monospace, monospace" style=3D"border-bottom-color:rgb(0,=
0,0);border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb=
(0,0,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin=
-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0=
px;padding-right:0px;padding-top:0px">=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0=
=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 f(*first, </font><span style=3D"border-botto=
m-color:rgb(0,0,0);border-bottom-style:none;border-bottom-width:0px;border-=
left-color:rgb(0,0,0);border-left-style:none;border-left-width:0px;border-r=
ight-color:rgb(0,0,0);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(0,0,0);border-top-style:none;border-top-width:0px;font-famil=
y:monospace,monospace;margin-bottom:0px;margin-left:0px;margin-right:0px;ma=
rgin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-=
top:0px">i)</span><span style=3D"border-bottom-color:rgb(0,0,0);border-bott=
om-style:none;border-bottom-width:0px;border-left-color:rgb(0,0,0);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(0,0,0);border-r=
ight-style:none;border-right-width:0px;border-top-color:rgb(0,0,0);border-t=
op-style:none;border-top-width:0px;font-family:monospace,monospace;margin-b=
ottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px">;</span></div><div st=
yle=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-botto=
m-width:0px;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:none;border-rig=
ht-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-top-w=
idth:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;=
padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><spa=
n style=3D"border-bottom-color:rgb(0,0,0);border-bottom-style:none;border-b=
ottom-width:0px;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:none;border=
-right-width:0px;border-top-color:rgb(0,0,0);border-top-style:none;border-t=
op-width:0px;font-family:monospace,monospace;margin-bottom:0px;margin-left:=
0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;pad=
ding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(0,0,0)=
;border-bottom-style:none;border-bottom-width:0px;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:none;border-right-width:0px;border-top-color:rgb(0,0=
,0);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-lef=
t:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;p=
adding-right:0px;padding-top:0px"></span></div></div></div></div><div style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:no=
ne;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-styl=
e:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-=
style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top=
-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-r=
ight:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0=
px;padding-top:0px">since we already have this ability in the nasty lambda =
above, why not provide the ability in a way that's easy to reason about=
?</div></div></div></div></blockquote><div><br></div><div>You can already d=
o the first one; just get rid of the structured binding bit. And the second=
and third ones have nothing to do with one another. They have completely d=
ifferent semantics.</div></div></div></blockquote><div><br></div><div>Um, I=
don't think you can do the first one.=C2=A0 Unless g++7.2.0 isn't =
complaint yet, the following snippet will not comple:</div><div><br></div><=
div><span style=3D"white-space:pre"> </span>std::vector<int> v =3D {1=
,2,3,4};</div><div><span style=3D"white-space:pre"> </span>for(auto i=3D0; =
auto&& e : v)</div><div><span style=3D"white-space:pre"> </span>{</=
div><div><span style=3D"white-space:pre"> </span>std::cout << e <=
< std::endl;</div><div><span style=3D"white-space:pre"> </span>}</div></=
div></blockquote><div><br></div><div>You can, just not in C++17. This chang=
e was approved at the last meeting, and was merged in the draft C++20 stand=
ard.</div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/8bf4ac7b-4c21-4bf1-95ed-c92124065bed%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/8bf4ac7b-4c21-4bf1-95ed-c92124065bed=
%40isocpp.org</a>.<br />
------=_Part_8045_1057829637.1515235633927--
------=_Part_8044_252057806.1515235633927--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 6 Jan 2018 08:18:16 -0800 (PST)
Raw View
------=_Part_1646_2018390014.1515255496690
Content-Type: multipart/alternative;
boundary="----=_Part_1647_1882888487.1515255496690"
------=_Part_1647_1882888487.1515255496690
Content-Type: text/plain; charset="UTF-8"
On Friday, January 5, 2018 at 9:27:11 PM UTC-5, Patrice Roy wrote:
>
> FWIW, Richard, I think your idea has merits. I have often found it a bit
> annoying not to be able to declare variables of different types in the init
> section of a for statement, and inspiration from lambda capture syntax /
> structured bindings seems harmonious to me.
>
If this multi-variable syntax is going to happen, I really would rather it
happen as a function of `auto` rather than structured bindings. That is,
rather than doing:
for(auto [a = 0, b = ""s]; a != N; ++a)
You do:
for(auto a = 0, b = ""s; a != N; ++a)
If you're going to allow a single statement to introduce/deduce variables
of multiple types, then that's what you should allow. This is not a form of
structured binding, and you don't really *want* it to be a form of
structured binding.
--
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/dd32198d-e9de-4c16-a220-2dfb7f3ae060%40isocpp.org.
------=_Part_1647_1882888487.1515255496690
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Friday, January 5, 2018 at 9:27:11 PM UTC-5, Patrice Ro=
y 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"><div>=
<div><div>FWIW, Richard, I think your idea has merits. I have often found i=
t a bit annoying not to be able to declare variables of different types in =
the init section of a for statement, and inspiration from lambda capture sy=
ntax / structured bindings seems harmonious to me.<br></div></div></div></d=
iv></blockquote><div>=C2=A0</div><div>If this multi-variable syntax is goin=
g to happen, I really would rather it happen as a function of `auto` rather=
than structured bindings. That is, rather than doing:</div><div><br></div>=
<div class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); w=
ord-wrap: break-word; background-color: rgb(250, 250, 250);"><code class=3D=
"prettyprint"><div class=3D"subprettyprint"><span class=3D"styled-by-pretti=
fy" style=3D"color: #008;">for</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=3D"col=
or: #008;">auto</span><span class=3D"styled-by-prettify" style=3D"color: #0=
00;"> </span><span class=3D"styled-by-prettify" style=3D"color: #660;">[</s=
pan><span class=3D"styled-by-prettify" style=3D"color: #000;">a </span><spa=
n class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><span class=
=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"style=
d-by-prettify" style=3D"color: #066;">0</span><span class=3D"styled-by-pret=
tify" style=3D"color: #660;">,</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #000;"> b </span><span class=3D"styled-by-prettify" style=3D"c=
olor: #660;">=3D</span><span class=3D"styled-by-prettify" style=3D"color: #=
000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #080;">&qu=
ot;"</span><span class=3D"styled-by-prettify" style=3D"color: #000;">s=
</span><span class=3D"styled-by-prettify" style=3D"color: #660;">];</span><=
span class=3D"styled-by-prettify" style=3D"color: #000;"> a </span><span cl=
ass=3D"styled-by-prettify" style=3D"color: #660;">!=3D</span><span class=3D=
"styled-by-prettify" style=3D"color: #000;"> N</span><span class=3D"styled-=
by-prettify" style=3D"color: #660;">;</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=
=3D"color: #660;">++</span><span class=3D"styled-by-prettify" style=3D"colo=
r: #000;">a</span><span class=3D"styled-by-prettify" style=3D"color: #660;"=
>)</span></div></code></div><div><span style=3D"display: inline !important;=
float: none; background-color: transparent; color: rgb(34, 34, 34); font-f=
amily: "Arial","Helvetica",sans-serif; font-size: 13px;=
font-style: normal; font-variant: normal; font-weight: 400; letter-spacing=
: normal; orphans: 2; text-align: left; text-decoration: none; text-indent:=
0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: no=
rmal; word-spacing: 0px;"><br></span></div><div><span style=3D"display: inl=
ine !important; float: none; background-color: transparent; color: rgb(34, =
34, 34); font-family: "Arial","Helvetica",sans-serif; f=
ont-size: 13px; font-style: normal; font-variant: normal; font-weight: 400;=
letter-spacing: normal; orphans: 2; text-align: left; text-decoration: non=
e; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; =
white-space: normal; word-spacing: 0px;">You do:</span></div><div><span sty=
le=3D"display: inline !important; float: none; background-color: transparen=
t; color: rgb(34, 34, 34); font-family: "Arial","Helvetica&q=
uot;,sans-serif; font-size: 13px; font-style: normal; font-variant: normal;=
font-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; te=
xt-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-s=
troke-width: 0px; white-space: normal; word-spacing: 0px;"><br></span></div=
><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"styled-by-pre=
ttify" style=3D"color: #008;">for</span><span class=3D"styled-by-prettify" =
style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=3D"=
color: #008;">auto</span><span class=3D"styled-by-prettify" style=3D"color:=
#000;"> a </span><span class=3D"styled-by-prettify" style=3D"color: #660;"=
>=3D</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </spa=
n><span class=3D"styled-by-prettify" style=3D"color: #066;">0</span><span c=
lass=3D"styled-by-prettify" style=3D"color: #660;">,</span><span class=3D"s=
tyled-by-prettify" style=3D"color: #000;"> b </span><span class=3D"styled-b=
y-prettify" style=3D"color: #660;">=3D</span><span class=3D"styled-by-prett=
ify" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" styl=
e=3D"color: #080;">""</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;">s</span><span class=3D"styled-by-prettify" style=3D"co=
lor: #660;">;</span><span class=3D"styled-by-prettify" style=3D"color: #000=
;"> a </span><span class=3D"styled-by-prettify" style=3D"color: #660;">!=3D=
</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> N</span><=
span class=3D"styled-by-prettify" style=3D"color: #660;">;</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"styl=
ed-by-prettify" style=3D"color: #660;">++</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #000;">a</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #660;">)</span></div></code></div><div><span style=3D"text-a=
lign: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px;=
letter-spacing: normal; font-family: "Arial","Helvetica&quo=
t;,sans-serif; font-size: 13px; font-variant: normal; word-spacing: 0px; di=
splay: inline !important; white-space: normal; orphans: 2; float: none; -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: "Arial","Helvetica",=
sans-serif; font-size: 13px; font-style: normal; font-variant: normal; font=
-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-de=
coration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke=
-width: 0px; white-space: normal; word-spacing: 0px;"><br></span></span></d=
iv><div>If you're going to allow a single statement to introduce/deduce=
variables of multiple types, then that's what you should allow. This i=
s not a form of structured binding, and you don't really <i>want</i> it=
to be a form of structured binding.</div><div><br></div><blockquote class=
=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #cc=
c solid;padding-left: 1ex;">
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/dd32198d-e9de-4c16-a220-2dfb7f3ae060%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/dd32198d-e9de-4c16-a220-2dfb7f3ae060=
%40isocpp.org</a>.<br />
------=_Part_1647_1882888487.1515255496690--
------=_Part_1646_2018390014.1515255496690--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 6 Jan 2018 09:14:08 -0800 (PST)
Raw View
------=_Part_8804_1260218026.1515258848912
Content-Type: multipart/alternative;
boundary="----=_Part_8805_1545938309.1515258848912"
------=_Part_8805_1545938309.1515258848912
Content-Type: text/plain; charset="UTF-8"
I know this post is almost a month old, but I wanted to clarify a
misunderstanding that happened here.
I am not "against the use of auto". I am against the* mindless* use of
auto. I'm against the ideology that one should use auto unless it is
literally impossible to avoid doing so.
`auto` is a great and useful tool, and I do put it to use. But like any
tool, it can be abused. And we should not invent idioms like AAA where
mindless use *invites* such abuse.
`auto` can improve the clarity of code. But misused, it can make code quite
inscrutable. And the power of `auto` to make code impenetrable should never
be ignored or forgotten. As such, any expansion of its powers must be
looked on with at least some hesitancy.
On Thursday, December 14, 2017 at 1:20:12 PM UTC-5, Richard Hodges wrote:
> On 14 December 2017 at 18:19, Nicol Bolas <jmck...@gmail.com <javascript:>
> > wrote:
>
>> ... right. Which is why I said you* should* bring it up. I wasn't being
>> sarcastic.
>>
>
>> Consider what I just said about having two "independent operations" on
>> the same line. If you're extracting begin/end from a range, then those*
>> aren't* "two independent operations". They're a single logical thought:
>>
>> auto beg = rng.begin(), end = rng.end();
>>
>> When you have something that is conceptually atomic that, by reason of
>> implementation, requires two distinct actions,* that* is when it is
>> appropriate to stick them in one line.
>>
>
> I think we agree here. Acquiring an index counter and the limits of a
> range seem to me to be part of the same logical atomic operation.
>
>>
>> Of course, you'll naturally try to say that getting iterators for two
>> separate ranges is also a single logical thought to your algorithm. But I
>> contest this because they're not atomic actions. Getting the beginning of a
>> range is useless without getting its end (in most cases). That's what makes
>> the pair of actions "atomic"; you can't do *anything* with them until
>> both are complete.
>>
>
> I wholeheartedly disagree. The c++ memory model mandates that getting the
> two pairs of iterators is indeed atomic. Everything between two memory
> fences is logically atomic. This is the foundation of the as-if rule. This
> is unarguable.
>
When I said "atomic", I did not mean "threadingly atomic". I meant what I
said: "conceptually atomic". That is, it is a single, logically indivisible
operation.
Calling a function is "conceptually atomic". You cannot call half of a
function, or a quarter of a function. You either call it or you don't;
regardless of how many individual steps it has, from the perspective of the
caller, it is a single indivisible operation.
Similarly, getting the iterators of a range is conceptually atomic. It
almost never makes sense to get just the begin iterator or just the end. If
you're getting one, then you need the other (or you already have it in some
way). The only cases where this isn't the case involve using just a begin
iterator because some other range is going to decide where it ends.
And let's be frank: that is a short path to buffer overrun attacks.
By contrast, getting the iterators for two ranges is two separate
conceptually atomic operations. The same goes for getting an indexed range
(whether you do that as just an integer that you increment or a real range,
the idea is the same). Getting an indexed range is a conceptually separate
operation, since you can choose to do so or not based on your particular
usage needs.
On Thursday, December 14, 2017 at 7:37:22 AM UTC-5, Richard Hodges wrote:
>>>
>>> Having pondered the responses, it turns out that I can express my
>>> algorithm in a tightly scoped, DRY and legal manner in current c++ like
>>> this:
>>>
>>
>> I'm not really sure what that proves. You can accomplish the same thing
>> by using curly braces:
>>
>> {
>> std::size_t ix = 0;
>> auto first = begin(v);
>> auto last = end(v);
>> for(; first != last; ++first, ++ix)
>> //Actual loop body;
>> }
>>
>> You can even remove the `begin` line by adding it to the `for` statement.
>> So what's the downside of this? Do you really need to write these
>> multi-variable things* that often* that we need a language change?
>> You've not answered that question.
>>
>
> That's a fair question. My initial response is that the extra curly braces
> are not beautiful. And to me elegance and beauty of code presentation is a
> factor in my enjoyment of writing it. To me, that's enough of a reason for
> a change (if not the one I originally proposed). I appreciate that you may
> not take aesthetics to heart as much as me.
>
Oh, I do take aesthetics to heart. That's* why* I disagree with you. We
simply have very different ideas about what is "beautiful".
See for me, it doesn't matter how you declare 4 variables in a `for`
initializer statement. Because no matter what syntax you use, it's ugly to
me based on the fact that *you have 4 loop variables*.
Beautiful code is hard to get wrong. When you have many loop variables,
it's easy to forget to increment the ones that need incrementing. And it's
easy to increment the wrong one. It's easy to forget to test one or to test
the wrong one.
Beautiful code provides minimal visual clutter. No matter what syntax you
use to declare 4 loop variables, I'm still seeing lots of code that has
nothing to do with the code inside the loop. I'm seeing a bunch of
initializing expressions. I'm seeing a bunch of conditions in the test. I'm
seeing a bunch of increments. Etc.
Beautiful code makes the user's intent clear and unequivocal. The more
visual clutter there is in a loop, the harder it is to tell what's actually
happening. The user's intent is lost.
The goal of C++ features should not be to make ugly code slightly less
ugly; it should be to make ugly code* beautiful*. We should be eliminating
or minimizing the desire to have these complex loops, not making them
slightly less ugly to write.
>
--
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/221244a9-ecd1-4e7b-841a-a0005df80e39%40isocpp.org.
------=_Part_8805_1545938309.1515258848912
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>I know this post is almost a month old, but I wanted =
to clarify a misunderstanding that happened here.</div><div><br></div><div>=
I am not "against the use of auto". I am against the<i> mindless<=
/i> use of auto. I'm against the ideology that one should use auto unle=
ss it is literally impossible to avoid doing so.</div><div><br></div><div>`=
auto` is a great and useful tool, and I do put it to use. But like any tool=
, it can be abused. And we should not invent idioms like AAA where mindless=
use <i>invites</i> such abuse.</div><div><br></div><div>`auto` can improve=
the clarity of code. But misused, it can make code quite inscrutable. And =
the power of `auto` to make code impenetrable should never be ignored or fo=
rgotten. As such, any expansion of its powers must be looked on with at lea=
st some hesitancy.</div><div><br></div><div><br>On Thursday, December 14, 2=
017 at 1:20:12 PM UTC-5, Richard Hodges wrote:<br></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"><div><div class=3D"gmail_quote=
">On 14 December 2017 at 18:19, Nicol Bolas <span dir=3D"ltr"><<a onmous=
edown=3D"this.href=3D'javascript:';return true;" onclick=3D"this.hr=
ef=3D'javascript:';return true;" href=3D"javascript:" target=3D"_bl=
ank" rel=3D"nofollow" gdf-obfuscated-mailto=3D"W9hqBMHlAAAJ">jmck...@gmail.=
com</a>></span> wrote:<br><blockquote class=3D"gmail_quote" style=3D"mar=
gin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1=
ex"><div dir=3D"ltr">... right. Which is why I said you<i> should</i> bring=
it up. I wasn't being sarcastic.</div></blockquote><blockquote class=
=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rg=
b(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Consi=
der what I just said about having two "independent operations" on=
the same line. If you're extracting begin/end from a range, then those=
<i> aren't</i> "two independent operations". They're a si=
ngle logical thought:</div><div><br></div><div style=3D"border:1px solid rg=
b(187,187,187);word-wrap:break-word;background-color:rgb(250,250,250)"><cod=
e><div><span style=3D"color:rgb(0,0,136)">auto</span><span style=3D"color:r=
gb(0,0,0)"> beg </span><span style=3D"color:rgb(102,102,0)">=3D</span><span=
style=3D"color:rgb(0,0,0)"> rng</span><span style=3D"color:rgb(102,102,0)"=
>.</span><span style=3D"color:rgb(0,0,136)">begin</span><span style=3D"colo=
r:rgb(102,102,0)">(),</span><span style=3D"color:rgb(0,0,0)"> </span><span =
style=3D"color:rgb(0,0,136)">end</span><span style=3D"color:rgb(0,0,0)"> </=
span><span style=3D"color:rgb(102,102,0)">=3D</span><span style=3D"color:rg=
b(0,0,0)"> rng</span><span style=3D"color:rgb(102,102,0)">.</span><span sty=
le=3D"color:rgb(0,0,136)">end</span><span style=3D"color:rgb(102,102,0)">()=
;</span></div></code></div><div><br></div><div>When you have something that=
is conceptually atomic that, by reason of implementation, requires two dis=
tinct actions,<i> that</i> is when it is appropriate to stick them in one l=
ine.</div></div></blockquote><div><br></div><div>I think we agree here. Acq=
uiring an index counter and the limits of a range seem to me to be part of =
the same logical atomic operation.=C2=A0</div><blockquote class=3D"gmail_qu=
ote" style=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,20=
4);padding-left:1ex"><div dir=3D"ltr"><div><br></div><div>Of course, you=
9;ll naturally try to say that getting iterators for two separate ranges is=
also a single logical thought to your algorithm. But I contest this becaus=
e they're not atomic actions. Getting the beginning of a range is usele=
ss without getting its end (in most cases). That's what makes the pair =
of actions "atomic"; you can't do <i>anything</i> with them u=
ntil both are complete.</div></div></blockquote><div><br></div><div>I whole=
heartedly disagree. The c++ memory model mandates that getting the two pair=
s of iterators is indeed atomic. Everything between two memory fences is lo=
gically atomic. This is the foundation of the as-if rule. This is unarguabl=
e.</div></div></div></div></blockquote><div><br></div><div>When I said &quo=
t;atomic", I did not mean "threadingly atomic". I meant what=
I said: "conceptually atomic". That is, it is a single, logicall=
y indivisible operation.</div><div><br></div><div>Calling a function is &qu=
ot;conceptually atomic". You cannot call half of a function, or a quar=
ter of a function. You either call it or you don't; regardless of how m=
any individual steps it has, from the perspective of the caller, it is a si=
ngle indivisible operation.</div><div><br></div><div>Similarly, getting the=
iterators of a range is <span style=3D"display: inline !important; float: =
none; background-color: transparent; color: rgb(34, 34, 34); font-family: &=
quot;Arial","Helvetica",sans-serif; font-size: 13px; font-st=
yle: normal; font-variant: normal; font-weight: 400; letter-spacing: normal=
; orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; te=
xt-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wo=
rd-spacing: 0px;">conceptually </span>atomic. It almost never makes sense t=
o get just the begin iterator or just the end. If you're getting one, t=
hen you need the other (or you already have it in some way). The only cases=
where this isn't the case involve using just a begin iterator because =
some other range is going to decide where it ends.</div><div><br></div><div=
>And let's be frank: that is a short path to buffer overrun attacks.</d=
iv><div><br></div><div>By contrast, getting the iterators for two ranges is=
two separate conceptually atomic operations. The same goes for getting an =
indexed range (whether you do that as just an integer that you increment or=
a real range, the idea is the same). Getting an indexed range is a concept=
ually separate operation, since you can choose to do so or not based on you=
r particular usage needs.</div><div><i><br></i></div><blockquote class=3D"g=
mail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc sol=
id;padding-left: 1ex;"><div dir=3D"ltr"><div><div class=3D"gmail_quote"><bl=
ockquote class=3D"gmail_quote" style=3D"margin:0px 0px 0px 0.8ex;border-lef=
t:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><div><span>=
<span style=3D"float:none;background-color:transparent;color:rgb(34,34,34);=
font-family:Arial,Helvetica,sans-serif;font-size:13px;font-style:normal;fon=
t-weight:400;letter-spacing:normal;text-align:left;text-decoration:none;tex=
t-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;displa=
y:inline">On Thursday, December 14, 2017 at 7:37:22 AM UTC-5, Richard Hodge=
s wrote:</span><blockquote class=3D"gmail_quote"><div style=3D"border-color=
:rgb(34,34,34);border-style:none;border-width:0px;margin:0px;padding:0px" d=
ir=3D"ltr">Having pondered the responses, it turns out that I can express m=
y algorithm in a tightly scoped, DRY and legal manner in current c++ like t=
his:</div></blockquote><div><br></div></span><div>I'm not really sure w=
hat that proves. You can accomplish the same thing by using curly braces:</=
div><div><br></div><div style=3D"border:1px solid rgb(187,187,187);word-wra=
p:break-word;background-color:rgb(250,250,250)"><code><div><span style=3D"c=
olor:rgb(102,102,0)">{</span><span style=3D"color:rgb(0,0,0)"><br>=C2=A0 st=
d</span><span style=3D"color:rgb(102,102,0)">::</span><span style=3D"color:=
rgb(0,0,0)">size_t ix </span><span style=3D"color:rgb(102,102,0)">=3D</span=
><span style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,102,10=
2)">0</span><span style=3D"color:rgb(102,102,0)">;</span><span><span style=
=3D"color:rgb(0,0,0)"><br>=C2=A0 </span><span style=3D"color:rgb(0,0,136)">=
auto</span><span style=3D"color:rgb(0,0,0)"> first </span><span style=3D"co=
lor:rgb(102,102,0)">=3D</span><span style=3D"color:rgb(0,0,0)"> </span><spa=
n style=3D"color:rgb(0,0,136)">begin</span><span style=3D"color:rgb(102,102=
,0)">(</span><span style=3D"color:rgb(0,0,0)">v</span><span style=3D"color:=
rgb(102,102,0)">);</span><span style=3D"color:rgb(0,0,0)"><br>=C2=A0 </span=
><span style=3D"color:rgb(0,0,136)">auto</span><span style=3D"color:rgb(0,0=
,0)"> </span><span style=3D"color:rgb(0,0,136)">last</span><span style=3D"c=
olor:rgb(0,0,0)"> </span><span style=3D"color:rgb(102,102,0)">=3D</span><sp=
an style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(0,0,136)">en=
d</span><span style=3D"color:rgb(102,102,0)">(</span><span style=3D"color:r=
gb(0,0,0)">v</span><span style=3D"color:rgb(102,102,0)">);</span></span><sp=
an style=3D"color:rgb(0,0,0)"><br>=C2=A0 </span><span style=3D"color:rgb(0,=
0,136)">for</span><span style=3D"color:rgb(102,102,0)">(;</span><span style=
=3D"color:rgb(0,0,0)"> first </span><span style=3D"color:rgb(102,102,0)">!=
=3D</span><span style=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb=
(0,0,136)">last</span><span style=3D"color:rgb(102,102,0)">;</span><span st=
yle=3D"color:rgb(0,0,0)"> </span><span style=3D"color:rgb(102,102,0)">++</s=
pan><span style=3D"color:rgb(0,0,0)">first</span><span style=3D"color:rgb(1=
02,102,0)">,</span><span style=3D"color:rgb(0,0,0)"> </span><span style=3D"=
color:rgb(102,102,0)">++</span><span style=3D"color:rgb(0,0,0)">ix</span><s=
pan style=3D"color:rgb(102,102,0)">)</span><span style=3D"color:rgb(0,0,0)"=
><br>=C2=A0 =C2=A0 </span><span style=3D"color:rgb(136,0,0)">//Actual loop =
body;</span><span style=3D"color:rgb(0,0,0)"><br></span><span style=3D"colo=
r:rgb(102,102,0)">}</span></div></code></div><div><br></div><div>You can ev=
en remove the `begin` line by adding it to the `for` statement. So what'=
;s the downside of this? Do you really need to write these multi-variable t=
hings<i> that often</i> that we need a language change? You've not answ=
ered that question.</div></div></div></blockquote><div><br></div><div>That&=
#39;s a fair question. My initial response is that the extra curly braces a=
re not beautiful. And to me elegance and beauty of code presentation is a f=
actor in my enjoyment of writing it. To me, that's enough of a reason f=
or a change (if not the one I originally proposed). I appreciate that you m=
ay not take aesthetics to heart as much as me.</div></div></div></div></blo=
ckquote><div><br></div><div>Oh, I do take aesthetics to heart. That's<i=
> why</i> I disagree with you. We simply have very different ideas about wh=
at is "beautiful".</div><div><i><br></i></div><div>See for me, it=
doesn't matter how you declare 4 variables in a `for` initializer stat=
ement. Because no matter what syntax you use, it's ugly to me based on =
the fact that <i>you have 4 loop variables</i>.</div><div><br></div><div>Be=
autiful code is hard to get wrong. When you have many loop variables, it=
9;s easy to forget to increment the ones that need incrementing. And it'=
;s easy to increment the wrong one. It's easy to forget to test one or =
to test the wrong one.</div><div><br></div><div>Beautiful code provides min=
imal visual clutter. No matter what syntax you use to declare 4 loop variab=
les, I'm still seeing lots of code that has nothing to do with the code=
inside the loop. I'm seeing a bunch of initializing expressions. I'=
;m seeing a bunch of conditions in the test. I'm seeing a bunch of incr=
ements. Etc.</div><div><br></div><div>Beautiful code makes the user's i=
ntent clear and unequivocal. The more visual clutter there is in a loop, th=
e harder it is to tell what's actually happening. The user's intent=
is lost.</div><div><br></div><div>The goal of C++ features should not be t=
o make ugly code slightly less ugly; it should be to make ugly code<i> beau=
tiful</i>. We should be eliminating or minimizing the desire to have these =
complex loops, not making them slightly less ugly to write.<br></div><block=
quote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-le=
ft: 1px #ccc solid;padding-left: 1ex;">
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/221244a9-ecd1-4e7b-841a-a0005df80e39%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/221244a9-ecd1-4e7b-841a-a0005df80e39=
%40isocpp.org</a>.<br />
------=_Part_8805_1545938309.1515258848912--
------=_Part_8804_1260218026.1515258848912--
.
Author: "'Johannes Schaub' via ISO C++ Standard - Future Proposals" <std-proposals@isocpp.org>
Date: Sat, 6 Jan 2018 20:27:43 +0100
Raw View
2017-12-13 11:15 GMT+01:00 Richard Hodges <hodges.r@gmail.com>:
> A simple example:
>
> Here's a fairly common idiom, expressed in terms of a structured binding:
>
> #include <iostream>
> #include <vector>
> #include <tuple>
>
> int main()
> {
> std::vector<int> v = { 6,5,4,3,2,1 };
>
> for( auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v),
> end(v))
> ; first != last
> ; ++i, ++first)
> {
> std::cout << "index: " << i << "\t" << *first << "\n";
> }
> }
>
> It seems sensible to me to group the loop's variables in a structured
> binding since
>
> it's succinct and,
> they remain firmly local to the loop's scope
> It's the only way to declare multiple dissimilar variables within the for
> statement.
>
>
> However, this code is not DRY - the naming of the bound variables must
> correspond to the creation of the tuple. Maintenance confusion awaits.
>
> It seems to me that a small, non-breaking syntax change could allow this:
>
> for( auto [i = size_t(0), first = begin(v), last = end(v)]
> ; first != last
> ; ++i, ++first)
> {
> // ...
> }
>
> which would:
>
> a) be 100% DRY,
> b) involve less typing
> c) match the syntax for lambda capture (I could expand further on my
> thoughts on that, but perhaps another day)
> d) IMHO be easier to teach
>
> Wouldn't that be better?
>
> I'd value your thoughts.
>
This "normal declaration with initialization" conflates with the
different concept of structured bindings. Also, this syntax IMO is
confusing. It reads to me as:
- Normally, each variable declared in a multi-declaration
declaration-statement must deduce to the same type,
- Except when you wrap "[..]" around everything, then you are allowed
different types.
In addition, "i", "first" and "last" *always* are references with
structured bindings, while users IMO would expect they are not
references if they are declared as "auto [ ...]" ("allow multiple
types"). One understands the reason only when one learns the
completely distinct concept of structured bindings and even then, the
reason won't hold anymore when in this orinary "declaration with
multiple types" case.
Alternative workaround using a feature that floated around in another
thread (lambda-like struct literals.. required because you need to
have access to "v" within the new struct):
for([&] struct { size_t i = 0; auto first = begin(v), second = end(v); } d;
d.first != d.last;
++d.first, ++d.last)
{
// ...
}
This requires "auto" for non-static data members, but in this narrow
use case.. perhaps one could allow that. After all, these initializers
don't require "this" to be a complete type.
--
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/CANu6V4VJt1ma9SE_wD_X%3DtismPcAMiArHzh9%3DSq2ERMKO7yZQw%40mail.gmail.com.
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sat, 6 Jan 2018 15:35:47 -0500
Raw View
--94eb2c0550d69db87b05622182bc
Content-Type: text/plain; charset="UTF-8"
Yes, that's an alternative syntax I think would work too. Changing the way
auto works as Nicol suggests seems like a bigger change to me, and I would
prefer avoiding that until there's a sound rationale and a paper exploring
its impact throughout the language (particularly with respect to concepts;
it's already quite complicated there).
Thanks!
2018-01-06 14:27 GMT-05:00 'Johannes Schaub' via ISO C++ Standard - Future
Proposals <std-proposals@isocpp.org>:
> 2017-12-13 11:15 GMT+01:00 Richard Hodges <hodges.r@gmail.com>:
> > A simple example:
> >
> > Here's a fairly common idiom, expressed in terms of a structured binding:
> >
> > #include <iostream>
> > #include <vector>
> > #include <tuple>
> >
> > int main()
> > {
> > std::vector<int> v = { 6,5,4,3,2,1 };
> >
> > for( auto [i, first, last] = std::make_tuple(std::size_t(0),
> begin(v),
> > end(v))
> > ; first != last
> > ; ++i, ++first)
> > {
> > std::cout << "index: " << i << "\t" << *first << "\n";
> > }
> > }
> >
> > It seems sensible to me to group the loop's variables in a structured
> > binding since
> >
> > it's succinct and,
> > they remain firmly local to the loop's scope
> > It's the only way to declare multiple dissimilar variables within the for
> > statement.
> >
> >
> > However, this code is not DRY - the naming of the bound variables must
> > correspond to the creation of the tuple. Maintenance confusion awaits.
> >
> > It seems to me that a small, non-breaking syntax change could allow this:
> >
> > for( auto [i = size_t(0), first = begin(v), last = end(v)]
> > ; first != last
> > ; ++i, ++first)
> > {
> > // ...
> > }
> >
> > which would:
> >
> > a) be 100% DRY,
> > b) involve less typing
> > c) match the syntax for lambda capture (I could expand further on my
> > thoughts on that, but perhaps another day)
> > d) IMHO be easier to teach
> >
> > Wouldn't that be better?
> >
> > I'd value your thoughts.
> >
>
> This "normal declaration with initialization" conflates with the
> different concept of structured bindings. Also, this syntax IMO is
> confusing. It reads to me as:
>
> - Normally, each variable declared in a multi-declaration
> declaration-statement must deduce to the same type,
> - Except when you wrap "[..]" around everything, then you are allowed
> different types.
>
> In addition, "i", "first" and "last" *always* are references with
> structured bindings, while users IMO would expect they are not
> references if they are declared as "auto [ ...]" ("allow multiple
> types"). One understands the reason only when one learns the
> completely distinct concept of structured bindings and even then, the
> reason won't hold anymore when in this orinary "declaration with
> multiple types" case.
>
> Alternative workaround using a feature that floated around in another
> thread (lambda-like struct literals.. required because you need to
> have access to "v" within the new struct):
>
> for([&] struct { size_t i = 0; auto first = begin(v), second = end(v); } d;
> d.first != d.last;
> ++d.first, ++d.last)
> {
> // ...
> }
>
> This requires "auto" for non-static data members, but in this narrow
> use case.. perhaps one could allow that. After all, these initializers
> don't require "this" to be a complete type.
>
> --
> 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/CANu6V4VJt1ma9SE_wD_X%3DtismPcAMiArHzh9%
> 3DSq2ERMKO7yZQw%40mail.gmail.com.
>
--
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/CAKiZDp1tYEpWLQrg0u8WYQeXKXUvTXSbAsnGZ2mZNd7W8s8NLA%40mail.gmail.com.
--94eb2c0550d69db87b05622182bc
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Yes, that's an alternative syntax I think would w=
ork too. Changing the way auto works as Nicol suggests seems like a bigger =
change to me, and I would prefer avoiding that until there's a sound ra=
tionale and a paper exploring its impact throughout the language (particula=
rly with respect to concepts; it's already quite complicated there).<br=
><br></div>Thanks!<br></div><div class=3D"gmail_extra"><br><div class=3D"gm=
ail_quote">2018-01-06 14:27 GMT-05:00 'Johannes Schaub' via ISO C++=
Standard - Future Proposals <span dir=3D"ltr"><<a href=3D"mailto:std-pr=
oposals@isocpp.org" target=3D"_blank">std-proposals@isocpp.org</a>></spa=
n>:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-=
left:1px #ccc solid;padding-left:1ex"><div class=3D"HOEnZb"><div class=3D"h=
5">2017-12-13 11:15 GMT+01:00 Richard Hodges <<a href=3D"mailto:hodges.r=
@gmail.com">hodges.r@gmail.com</a>>:<br>
> A simple example:<br>
><br>
> Here's a fairly common idiom, expressed in terms of a structured b=
inding:<br>
><br>
> #include <iostream><br>
> #include <vector><br>
> #include <tuple><br>
><br>
> int main()<br>
> {<br>
>=C2=A0 =C2=A0 =C2=A0std::vector<int> v =3D { 6,5,4,3,2,1 };<br>
><br>
>=C2=A0 =C2=A0 =C2=A0for( auto [i, first, last] =3D std::make_tuple(std:=
:size_t(0)<wbr>, begin(v),<br>
> end(v))<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ; first !=3D last<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ; ++i, ++first)<br>
>=C2=A0 =C2=A0 =C2=A0{<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0std::cout << "index: "=
; << i << "\t" << *first << "\n"=
;;<br>
>=C2=A0 =C2=A0 =C2=A0}<br>
> }<br>
><br>
> It seems sensible to me to group the loop's variables in a structu=
red<br>
> binding since<br>
><br>
> it's succinct and,<br>
> they remain firmly local to the loop's scope<br>
> It's the only way to declare multiple dissimilar variables within =
the for<br>
> statement.<br>
><br>
><br>
> However, this code is not DRY - the naming of the bound variables must=
<br>
> correspond to the creation of the tuple. Maintenance confusion awaits.=
<br>
><br>
> It seems to me that a small, non-breaking syntax change could allow th=
is:<br>
><br>
>=C2=A0 =C2=A0 =C2=A0for( auto [i =3D size_t(0), first =3D begin(v), las=
t =3D end(v)]<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ; first !=3D last<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 ; ++i, ++first)<br>
>=C2=A0 =C2=A0 =C2=A0{<br>
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0// ...<br>
>=C2=A0 =C2=A0 =C2=A0}<br>
><br>
> which would:<br>
><br>
> a) be 100% DRY,<br>
> b) involve less typing<br>
> c) match the syntax for lambda capture (I could expand further on my<b=
r>
> thoughts on that, but perhaps another day)<br>
> d) IMHO be easier to teach<br>
><br>
> Wouldn't that be better?<br>
><br>
> I'd value your thoughts.<br>
><br>
<br>
</div></div>This "normal declaration with initialization" conflat=
es with the<br>
different concept of structured bindings. Also, this syntax IMO is<br>
confusing. It reads to me as:<br>
<br>
- Normally, each variable declared in a multi-declaration<br>
declaration-statement must deduce to the same type,<br>
- Except when you wrap "[..]" around everything, then you are all=
owed<br>
different types.<br>
<br>
In addition, "i", "first" and "last" *always*=
are references with<br>
structured bindings, while users IMO would expect they are not<br>
references if they are declared as "auto [ ...]" ("allow mul=
tiple<br>
types"). One understands the reason only when one learns the<br>
completely distinct concept of structured bindings and even then, the<br>
reason won't hold anymore when in this orinary "declaration with<b=
r>
multiple types" case.<br>
<br>
Alternative workaround using a feature that floated around in another<br>
thread (lambda-like struct literals.. required because you need to<br>
have access to "v" within the new struct):<br>
<br>
for([&] struct { size_t i =3D 0; auto first =3D begin(v), second =3D en=
d(v); } d;<br>
=C2=A0 =C2=A0 =C2=A0d.first !=3D d.last;<br>
=C2=A0 =C2=A0 =C2=A0++d.first, ++d.last)<br>
{<br>
=C2=A0// ...<br>
}<br>
<br>
This requires "auto" for non-static data members, but in this nar=
row<br>
use case.. perhaps one could allow that. After all, these initializers<br>
don't require "this" to be a complete type.<br>
<span class=3D""><br>
--<br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org">std-propo=
sals+unsubscribe@<wbr>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>
</span>To view this discussion on the web visit <a href=3D"https://groups.g=
oogle.com/a/isocpp.org/d/msgid/std-proposals/CANu6V4VJt1ma9SE_wD_X%3DtismPc=
AMiArHzh9%3DSq2ERMKO7yZQw%40mail.gmail.com" rel=3D"noreferrer" target=3D"_b=
lank">https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposal=
s/CANu6V4VJt1ma9SE_wD_<wbr>X%3DtismPcAMiArHzh9%<wbr>3DSq2ERMKO7yZQw%40mail.=
gmail.<wbr>com</a>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp1tYEpWLQrg0u8WYQeXKXUvTXSbAsnG=
Z2mZNd7W8s8NLA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp1tYEpWLQrg=
0u8WYQeXKXUvTXSbAsnGZ2mZNd7W8s8NLA%40mail.gmail.com</a>.<br />
--94eb2c0550d69db87b05622182bc--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sat, 6 Jan 2018 22:42:31 +0200
Raw View
On 6 January 2018 at 22:35, Patrice Roy <patricer@gmail.com> wrote:
> Yes, that's an alternative syntax I think would work too. Changing the way
> auto works as Nicol suggests seems like a bigger change to me, and I would
> prefer avoiding that until there's a sound rationale and a paper exploring
> its impact throughout the language (particularly with respect to concepts;
> it's already quite complicated there).
>
> Thanks!
Perhaps we should just do
for(idx_iter d = v;
d.first != d.last;
++d.first, ++d.i)
{
// ...
}
That is, standardize a library type that can initialize itself from a
container, and provides access to an index and the pair of iterators.
--
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/CAFk2RUZh9rG5Zn2UdSFEAJk3Zuu8q2O0EdcnogdUaEjM58vUeA%40mail.gmail.com.
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sat, 6 Jan 2018 17:03:36 -0500
Raw View
--94eb2c1b03d4aa9fdf056222bca3
Content-Type: text/plain; charset="UTF-8"
I think it might be useful, but would not cover the use-cases brought to
light by Richard in his initial post.
2018-01-06 15:42 GMT-05:00 Ville Voutilainen <ville.voutilainen@gmail.com>:
> On 6 January 2018 at 22:35, Patrice Roy <patricer@gmail.com> wrote:
> > Yes, that's an alternative syntax I think would work too. Changing the
> way
> > auto works as Nicol suggests seems like a bigger change to me, and I
> would
> > prefer avoiding that until there's a sound rationale and a paper
> exploring
> > its impact throughout the language (particularly with respect to
> concepts;
> > it's already quite complicated there).
> >
> > Thanks!
>
> Perhaps we should just do
>
> for(idx_iter d = v;
> d.first != d.last;
> ++d.first, ++d.i)
> {
> // ...
> }
>
> That is, standardize a library type that can initialize itself from a
> container, and provides access to an index and the pair of iterators.
>
> --
> 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/CAFk2RUZh9rG5Zn2UdSFEAJk3Zuu8q
> 2O0EdcnogdUaEjM58vUeA%40mail.gmail.com.
>
--
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/CAKiZDp1aoi_XhFgwTCsAACP1zz_mdnRdWkYYsMDGCO2-S9BLsA%40mail.gmail.com.
--94eb2c1b03d4aa9fdf056222bca3
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I think it might be useful, but would not cover the use-ca=
ses brought to light by Richard in his initial post.<br></div><div class=3D=
"gmail_extra"><br><div class=3D"gmail_quote">2018-01-06 15:42 GMT-05:00 Vil=
le Voutilainen <span dir=3D"ltr"><<a href=3D"mailto:ville.voutilainen@gm=
ail.com" target=3D"_blank">ville.voutilainen@gmail.com</a>></span>:<br><=
blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px=
#ccc solid;padding-left:1ex"><span class=3D"">On 6 January 2018 at 22:35, =
Patrice Roy <<a href=3D"mailto:patricer@gmail.com">patricer@gmail.com</a=
>> wrote:<br>
> Yes, that's an alternative syntax I think would work too. Changing=
the way<br>
> auto works as Nicol suggests seems like a bigger change to me, and I w=
ould<br>
> prefer avoiding that until there's a sound rationale and a paper e=
xploring<br>
> its impact throughout the language (particularly with respect to conce=
pts;<br>
> it's already quite complicated there).<br>
><br>
> Thanks!<br>
<br>
</span>Perhaps we should just do<br>
<br>
for(idx_iter d =3D v;<br>
=C2=A0 =C2=A0 =C2=A0d.first !=3D d.last;<br>
=C2=A0 =C2=A0 =C2=A0++d.first, ++d.i)<br>
{<br>
=C2=A0// ...<br>
}<br>
<br>
That is, standardize a library type that can initialize itself from a<br>
container, and provides access to an index and the pair of iterators.<br>
<span class=3D""><br>
--<br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org">std-propo=
sals+unsubscribe@<wbr>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>
</span>To view this discussion on the web visit <a href=3D"https://groups.g=
oogle.com/a/isocpp.org/d/msgid/std-proposals/CAFk2RUZh9rG5Zn2UdSFEAJk3Zuu8q=
2O0EdcnogdUaEjM58vUeA%40mail.gmail.com" rel=3D"noreferrer" target=3D"_blank=
">https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/<w=
br>CAFk2RUZh9rG5Zn2UdSFEAJk3Zuu8q<wbr>2O0EdcnogdUaEjM58vUeA%40mail.<wbr>gma=
il.com</a>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp1aoi_XhFgwTCsAACP1zz_mdnRdWkYY=
sMDGCO2-S9BLsA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp1aoi_XhFgw=
TCsAACP1zz_mdnRdWkYYsMDGCO2-S9BLsA%40mail.gmail.com</a>.<br />
--94eb2c1b03d4aa9fdf056222bca3--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sat, 6 Jan 2018 19:22:49 -0800 (PST)
Raw View
------=_Part_9916_121923776.1515295369952
Content-Type: multipart/alternative;
boundary="----=_Part_9917_613536146.1515295369952"
------=_Part_9917_613536146.1515295369952
Content-Type: text/plain; charset="UTF-8"
On Saturday, January 6, 2018 at 3:35:50 PM UTC-5, Patrice Roy wrote:
>
> Yes, that's an alternative syntax I think would work too. Changing the way
> auto works as Nicol suggests seems like a bigger change to me,
>
A bigger change? The `auto` change requires nothing more than removing *half
of a sentence* from the standard (in [dcl.spec.auto]/7). That's a much
smaller change than introducing a type declaration. In terms of compiler
implementation, it requires removing the check that [dcl.spec.auto]/7
requires. Again, far less work than introducing an entirely new grammatical
construct.
> and I would prefer avoiding that until there's a sound rationale and a
> paper exploring its impact throughout the language (particularly with
> respect to concepts; it's already quite complicated there).
>
Concept interaction with `auto` declarations would be no more complicated
for multiple variables than for the member variables inside your "lambda
struct".
>
--
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/dd97066a-6f90-46b0-bb92-c2a6119954ab%40isocpp.org.
------=_Part_9917_613536146.1515295369952
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Saturday, January 6, 2018 at 3:35:50 PM UTC-5, Patrice =
Roy 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"><di=
v>Yes, that's an alternative syntax I think would work too. Changing th=
e way auto works as Nicol suggests seems like a bigger change to me,</div><=
/div></blockquote><div>=C2=A0</div><div>A bigger change? The `auto` change =
requires nothing more than removing <i>half of a sentence</i> from the stan=
dard (in [dcl.spec.auto]/7). That's a much smaller change than introduc=
ing a type declaration. In terms of compiler implementation, it requires re=
moving the check that [dcl.spec.auto]/7 requires. Again, far less work than=
introducing an entirely new grammatical construct.</div><div>=C2=A0</div><=
blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bord=
er-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>and I wou=
ld prefer avoiding that until there's a sound rationale and a paper exp=
loring its impact throughout the language (particularly with respect to con=
cepts; it's already quite complicated there).<br></div></div></blockquo=
te><div><br></div><div>Concept interaction with `auto` declarations would b=
e no more complicated for multiple variables than for the member variables =
inside your "lambda struct".<br></div><blockquote class=3D"gmail_=
quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;pa=
dding-left: 1ex;">
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/dd97066a-6f90-46b0-bb92-c2a6119954ab%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/dd97066a-6f90-46b0-bb92-c2a6119954ab=
%40isocpp.org</a>.<br />
------=_Part_9917_613536146.1515295369952--
------=_Part_9916_121923776.1515295369952--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Sun, 7 Jan 2018 04:07:32 +0000
Raw View
--94eb2c061b40355c93056227d20e
Content-Type: text/plain; charset="UTF-8"
I agree. From my perspective, allowing multiple auto types in one statement
is a significantly cleaner option - especially when, from what I can tell,
the purpose of the other option is being able to work around the fact that
multiple auto types aren't allowed.
On 7 Jan 2018 03:22, "Nicol Bolas" <jmckesson@gmail.com> wrote:
> On Saturday, January 6, 2018 at 3:35:50 PM UTC-5, Patrice Roy wrote:
>>
>> Yes, that's an alternative syntax I think would work too. Changing the
>> way auto works as Nicol suggests seems like a bigger change to me,
>>
>
> A bigger change? The `auto` change requires nothing more than removing *half
> of a sentence* from the standard (in [dcl.spec.auto]/7). That's a much
> smaller change than introducing a type declaration. In terms of compiler
> implementation, it requires removing the check that [dcl.spec.auto]/7
> requires. Again, far less work than introducing an entirely new grammatical
> construct.
>
>
>> and I would prefer avoiding that until there's a sound rationale and a
>> paper exploring its impact throughout the language (particularly with
>> respect to concepts; it's already quite complicated there).
>>
>
> Concept interaction with `auto` declarations would be no more complicated
> for multiple variables than for the member variables inside your "lambda
> struct".
>
>> --
> 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/dd97066a-6f90-46b0-
> bb92-c2a6119954ab%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/dd97066a-6f90-46b0-bb92-c2a6119954ab%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CAC%2B0CCPKaWp3XfZLKaDdkXZBQR-LtLRtFC9yMoO%3DB%3DEmq_LeiA%40mail.gmail.com.
--94eb2c061b40355c93056227d20e
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto">I agree. From my perspective, allowing multiple auto type=
s in one statement is a significantly cleaner option - especially when, fro=
m what I can tell, the purpose of the other option is being able to work ar=
ound the fact that multiple auto types aren't allowed.</div><div class=
=3D"gmail_extra"><br><div class=3D"gmail_quote">On 7 Jan 2018 03:22, "=
Nicol Bolas" <<a href=3D"mailto:jmckesson@gmail.com">jmckesson@gmai=
l.com</a>> wrote:<br type=3D"attribution"><blockquote class=3D"gmail_quo=
te" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"=
><div dir=3D"ltr">On Saturday, January 6, 2018 at 3:35:50 PM UTC-5, Patrice=
Roy 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"><div>Ye=
s, that's an alternative syntax I think would work too. Changing the wa=
y auto works as Nicol suggests seems like a bigger change to me,</div></div=
></blockquote><div>=C2=A0</div><div>A bigger change? The `auto` change requ=
ires nothing more than removing <i>half of a sentence</i> from the standard=
(in [dcl.spec.auto]/7). That's a much smaller change than introducing =
a type declaration. In terms of compiler implementation, it requires removi=
ng the check that [dcl.spec.auto]/7 requires. Again, far less work than int=
roducing an entirely new grammatical construct.</div><div>=C2=A0</div><bloc=
kquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-lef=
t:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>and I would prefer=
avoiding that until there's a sound rationale and a paper exploring it=
s impact throughout the language (particularly with respect to concepts; it=
's already quite complicated there).<br></div></div></blockquote><div><=
br></div><div>Concept interaction with `auto` declarations would be no more=
complicated for multiple variables than for the member variables inside yo=
ur "lambda struct".<br></div><blockquote class=3D"gmail_quote" st=
yle=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1=
ex">
</blockquote></div>
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/dd97066a-6f90-46b0-bb92-c2a6119954ab%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/dd97=
066a-6f90-46b0-<wbr>bb92-c2a6119954ab%40isocpp.org</a><wbr>.<br>
</blockquote></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCPKaWp3XfZLKaDdkXZBQR-LtLRtFC=
9yMoO%3DB%3DEmq_LeiA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCPK=
aWp3XfZLKaDdkXZBQR-LtLRtFC9yMoO%3DB%3DEmq_LeiA%40mail.gmail.com</a>.<br />
--94eb2c061b40355c93056227d20e--
.
Author: mihailnajdenov@gmail.com
Date: Sun, 7 Jan 2018 04:48:37 -0800 (PST)
Raw View
------=_Part_4183_399750390.1515329317609
Content-Type: multipart/alternative;
boundary="----=_Part_4184_1965590216.1515329317609"
------=_Part_4184_1965590216.1515329317609
Content-Type: text/plain; charset="UTF-8"
Now it seems *the best* time to investigate the possibility for auto to
being able to declare multiple, comma separated, variables.
With the new init if, and the new init range-for - we *should* be able to
do as much work as possible in a single statement!
It looks to me the disallow is just legacy "compatibility" mode - to let
auto be optional.
I also can't imagine how this can break existing code, as there is no
conversion/promotion right now - the types must be exactly the same - but
as said, this must be investigated.
Can someone write a paper, if one is not already written, to get the ball
rolling? Nicol Bolas? Giovanni Piero Deretta?
I read, this was "voted against", but that was 10+ years ago, I imagine,
and it is perfectly OK to be conservative on the first iteration of the
feature (let auto be optional),
but as I said, *now is the best time* to re-investigate the issue! At last
we should have paper and hear some arguments against, because I can't think
of any deal-breaking.
--
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/a171419e-cd0f-461a-95ec-fdfaa0b7ff9a%40isocpp.org.
------=_Part_4184_1965590216.1515329317609
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Now it seems <i>the best</i> time to investigate the =
possibility for <font face=3D"courier new,monospace">auto</font> to being a=
ble to declare multiple, comma separated, variables.</div><div><br></div><d=
iv>With the new init if, and the new init range-for - we <i>should</i> be a=
ble to do as much work as possible in a single statement!</div><div><br></d=
iv><div><br></div><div>It looks to me the disallow is just legacy "com=
patibility" mode - to let auto be optional.=C2=A0</div><div>I also can=
't imagine how this can break existing code, as there is no conversion/=
promotion right now - the types must be exactly the same - but as said, thi=
s must be investigated.</div><div><br></div><div><br></div><div>Can someone=
write a paper,=C2=A0<span style=3D"display: inline !important; float: none=
; background-color: transparent; color: rgb(34, 34, 34); font-family: "=
;Arial","Helvetica",sans-serif; font-size: 13px; font-style:=
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; or=
phans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-t=
ransform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-s=
pacing: 0px;">if one is not already written, to get the ball rolling?=C2=A0=
<span style=3D"display: inline !important; float: none; background-color: t=
ransparent; color: rgb(34, 34, 34); font-family: "Arial","He=
lvetica",sans-serif; font-size: 13px; font-style: normal; font-variant=
: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align:=
left; text-decoration: none; text-indent: 0px; text-transform: none; -webk=
it-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">Nicol B=
olas? Giovanni Piero Deretta?</span></span></div><div>I read, this was &quo=
t;voted against", but that was 10+ years ago, I imagine, and it is per=
fectly OK to be conservative on the first iteration of the feature (let aut=
o be optional),</div><div> but as I said, <i>now is the best time</i> to re=
-investigate the issue! At last we should have paper and hear some argument=
s against, because I can't think of any deal-breaking.=C2=A0</div><div>=
<i></i><i></i><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/a171419e-cd0f-461a-95ec-fdfaa0b7ff9a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/a171419e-cd0f-461a-95ec-fdfaa0b7ff9a=
%40isocpp.org</a>.<br />
------=_Part_4184_1965590216.1515329317609--
------=_Part_4183_399750390.1515329317609--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 7 Jan 2018 07:12:29 -0800 (PST)
Raw View
------=_Part_11304_220119216.1515337949649
Content-Type: multipart/alternative;
boundary="----=_Part_11305_1017530222.1515337949650"
------=_Part_11305_1017530222.1515337949650
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 7:48:37 AM UTC-5, mihailn...@gmail.com wrote:
>
> Now it seems *the best* time to investigate the possibility for auto to
> being able to declare multiple, comma separated, variables.
>
> With the new init if, and the new init range-for - we *should* be able to
> do as much work as possible in a single statement!
>
Long statements are not* clear* statements. The more a statement does, the
less easy it is to figure out what it's doing.
We didn't add initializers to `if`, `switch`, and range `for` to make them
"do as much work as possible". It was done to make code less brittle
("solving" the temporary range issue) or to deal with cases where you need
to compute a value, test if its valid, and then use it in an `if` statement.
This is the principle downside to me of allowing variables of different
types in `auto`: that it will encourage people to declare every variable in
a block in one statement, even when it isn't necessary.
> It looks to me the disallow is just legacy "compatibility" mode - to let
> auto be optional.
>
`auto` is optional; adding this will not make it any less optional. I don't
know what you mean by this.
> I also can't imagine how this can break existing code, as there is no
> conversion/promotion right now - the types must be exactly the same - but
> as said, this must be investigated.
>
>
> Can someone write a paper, if one is not already written, to get the ball
> rolling? Nicol Bolas? Giovanni Piero Deretta?
>
I'm not going to do it because I genuinely don't really want to see this
happen. See the above for reasons why.
But if some form of multiple deduction is going to happen, then this is the
correct form for it to take (rather than (ab)using "structured binding"
syntax).
I read, this was "voted against", but that was 10+ years ago, I imagine,
> and it is perfectly OK to be conservative on the first iteration of the
> feature (let auto be optional),
> but as I said, *now is the best time* to re-investigate the issue! At
> last we should have paper and hear some arguments against, because I can't
> think of any deal-breaking.
>
--
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/7bfb9949-66a0-4f04-89d9-d437fe8df147%40isocpp.org.
------=_Part_11305_1017530222.1515337949650
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, January 7, 2018 at 7:48:37 AM UTC-5, mihailn...=
@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr"><div>Now it seems <i>the best</i> time to investigate the possibility f=
or <font face=3D"courier new,monospace">auto</font> to being able to declar=
e multiple, comma separated, variables.</div><div><br></div><div>With the n=
ew init if, and the new init range-for - we <i>should</i> be able to do as =
much work as possible in a single statement!</div></div></blockquote><div><=
br></div><div>Long statements are not<i> clear</i> statements. The more a s=
tatement does, the less easy it is to figure out what it's doing.</div>=
<div><br></div><div>We didn't add initializers to `if`, `switch`, and r=
ange `for` to make them "do as much work as possible". It was don=
e to make code less brittle ("solving" the temporary range issue)=
or to deal with cases where you need to compute a value, test if its valid=
, and then use it in an `if` statement.</div><div><br></div><div>This is th=
e principle downside to me of allowing variables of different types in `aut=
o`: that it will encourage people to declare every variable in a block in o=
ne statement, even when it isn't necessary.<i></i></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #=
ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>It looks to me the disa=
llow is just legacy "compatibility" mode - to let auto be optiona=
l.</div></div></blockquote><div><br></div><div>`auto` is optional; adding t=
his will not make it any less optional. I don't know what you mean by t=
his.</div><div>=C2=A0</div><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>I also can't imagine how this can break existing cod=
e, as there is no conversion/promotion right now - the types must be exactl=
y the same - but as said, this must be investigated.</div><div><br></div><d=
iv><br></div><div>Can someone write a paper,=C2=A0<span style=3D"display:in=
line!important;float:none;background-color:transparent;color:rgb(34,34,34);=
font-family:"Arial","Helvetica",sans-serif;font-size:13=
px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:nor=
mal;text-align:left;text-decoration:none;text-indent:0px;text-transform:non=
e;white-space:normal;word-spacing:0px">if one is not already written, to ge=
t the ball rolling?=C2=A0<span style=3D"display:inline!important;float:none=
;background-color:transparent;color:rgb(34,34,34);font-family:"Arial&q=
uot;,"Helvetica",sans-serif;font-size:13px;font-style:normal;font=
-variant:normal;font-weight:400;letter-spacing:normal;text-align:left;text-=
decoration:none;text-indent:0px;text-transform:none;white-space:normal;word=
-spacing:0px">Nicol Bolas? Giovanni Piero Deretta?</span></span></div></div=
></blockquote><div><br></div><div>I'm not going to do it because I genu=
inely don't really want to see this happen. See the above for reasons w=
hy.</div><div><br></div><div>But if some form of multiple deduction is goin=
g to happen, then this is the correct form for it to take (rather than (ab)=
using "structured binding" syntax).</div><div><br></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>I read, this was =
"voted against", but that was 10+ years ago, I imagine, and it is=
perfectly OK to be conservative on the first iteration of the feature (let=
auto be optional),</div><div> but as I said, <i>now is the best time</i> t=
o re-investigate the issue! At last we should have paper and hear some argu=
ments against, because I can't think of any deal-breaking.<br></div></d=
iv></blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/7bfb9949-66a0-4f04-89d9-d437fe8df147%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/7bfb9949-66a0-4f04-89d9-d437fe8df147=
%40isocpp.org</a>.<br />
------=_Part_11305_1017530222.1515337949650--
------=_Part_11304_220119216.1515337949649--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sun, 7 Jan 2018 11:19:18 -0500
Raw View
--94eb2c0550d63805b30562320bf9
Content-Type: text/plain; charset="UTF-8"
I don't think it's a matter of sentence length in the standard text. It's
more a matter of :
int a = 2, b = 3; // same type
auto x = "hello"s, y = 3.14159; // distinct types, quite new; impact on the
way people write C++? Requires thought, at the very least
// ...
template <Regular T> void f(T, T); // same type
void g(Regular, Regular); // if short syntax eventually gets in : same
type? different types?
void h(auto a, auto b); // same rules as Regular,Regular or not? Papers
have been written debating both options
If you see single-auto, multiple types as the way to go, I think it's a
position that deserves a paper. It does not jump as being to path to follow
in a self-evident manner; maybe you'll find a convincing angle, and I for
one will happily read it once it's written. The alternatives seem less
contentious to me, given prior art, but I'm open to examining what you have
in mind once it's been put in proposal form.
2018-01-06 22:22 GMT-05:00 Nicol Bolas <jmckesson@gmail.com>:
> On Saturday, January 6, 2018 at 3:35:50 PM UTC-5, Patrice Roy wrote:
>>
>> Yes, that's an alternative syntax I think would work too. Changing the
>> way auto works as Nicol suggests seems like a bigger change to me,
>>
>
> A bigger change? The `auto` change requires nothing more than removing *half
> of a sentence* from the standard (in [dcl.spec.auto]/7). That's a much
> smaller change than introducing a type declaration. In terms of compiler
> implementation, it requires removing the check that [dcl.spec.auto]/7
> requires. Again, far less work than introducing an entirely new grammatical
> construct.
>
>
>> and I would prefer avoiding that until there's a sound rationale and a
>> paper exploring its impact throughout the language (particularly with
>> respect to concepts; it's already quite complicated there).
>>
>
> Concept interaction with `auto` declarations would be no more complicated
> for multiple variables than for the member variables inside your "lambda
> struct".
>
>> --
> 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/dd97066a-6f90-46b0-
> bb92-c2a6119954ab%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/dd97066a-6f90-46b0-bb92-c2a6119954ab%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CAKiZDp05bRWpUZieX4nC%2BkRAKs%3DBha_rMy7CfoMz3MZMwiJnLQ%40mail.gmail.com.
--94eb2c0550d63805b30562320bf9
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div><div><div><div>I don't think it's a matter of=
sentence length in the standard text. It's more a matter of :<br><br><=
/div>int a =3D 2, b =3D 3; // same type<br></div>auto x =3D "hello&quo=
t;s, y =3D 3.14159; // distinct types, quite new; impact on the way people =
write C++? Requires thought, at the very least<br>// ...</div><div>template=
<Regular T> void f(T, T); // same type<br></div><div>void g(Regular,=
Regular); // if short syntax eventually gets in : same type? different typ=
es?</div><div>void h(auto a, auto b); // same rules as Regular,Regular or n=
ot? Papers have been written debating both options<br></div><div><br></div>=
</div>If you see single-auto, multiple types as the way to go, I think it&#=
39;s a position that deserves a paper. It does not jump as being to path to=
follow in a self-evident manner; maybe you'll find a convincing angle,=
and I for one will happily read it once it's written. The alternatives=
seem less contentious to me, given prior art, but I'm open to examinin=
g what you have in mind once it's been put in proposal form.<br><br><br=
><div><div><br></div></div></div><div class=3D"gmail_extra"><br><div class=
=3D"gmail_quote">2018-01-06 22:22 GMT-05:00 Nicol Bolas <span dir=3D"ltr">&=
lt;<a href=3D"mailto:jmckesson@gmail.com" target=3D"_blank">jmckesson@gmail=
..com</a>></span>:<br><blockquote class=3D"gmail_quote" style=3D"margin:0=
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><sp=
an class=3D"">On Saturday, January 6, 2018 at 3:35:50 PM UTC-5, Patrice Roy=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Yes, t=
hat's an alternative syntax I think would work too. Changing the way au=
to works as Nicol suggests seems like a bigger change to me,</div></div></b=
lockquote><div>=C2=A0</div></span><div>A bigger change? The `auto` change r=
equires nothing more than removing <i>half of a sentence</i> from the stand=
ard (in [dcl.spec.auto]/7). That's a much smaller change than introduci=
ng a type declaration. In terms of compiler implementation, it requires rem=
oving the check that [dcl.spec.auto]/7 requires. Again, far less work than =
introducing an entirely new grammatical construct.</div><span class=3D""><d=
iv>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-l=
eft:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><di=
v>and I would prefer avoiding that until there's a sound rationale and =
a paper exploring its impact throughout the language (particularly with res=
pect to concepts; it's already quite complicated there).<br></div></div=
></blockquote><div><br></div></span><div>Concept interaction with `auto` de=
clarations would be no more complicated for multiple variables than for the=
member variables inside your "lambda struct".<br></div><blockquo=
te class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1p=
x #ccc solid;padding-left:1ex">
</blockquote></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/dd97066a-6f90-46b0-bb92-c2a6119954ab%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/dd97=
066a-6f90-46b0-<wbr>bb92-c2a6119954ab%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp05bRWpUZieX4nC%2BkRAKs%3DBha_r=
My7CfoMz3MZMwiJnLQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp05bRWp=
UZieX4nC%2BkRAKs%3DBha_rMy7CfoMz3MZMwiJnLQ%40mail.gmail.com</a>.<br />
--94eb2c0550d63805b30562320bf9--
.
Author: mihailnajdenov@gmail.com
Date: Sun, 7 Jan 2018 08:25:19 -0800 (PST)
Raw View
------=_Part_11714_282904332.1515342319610
Content-Type: multipart/alternative;
boundary="----=_Part_11715_744114806.1515342319611"
------=_Part_11715_744114806.1515342319611
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 5:12:29 PM UTC+2, Nicol Bolas wrote:
>
> On Sunday, January 7, 2018 at 7:48:37 AM UTC-5, mihailn...@gmail.com
> wrote:
>>
>> Now it seems *the best* time to investigate the possibility for auto to
>> being able to declare multiple, comma separated, variables.
>>
>> With the new init if, and the new init range-for - we *should* be able
>> to do as much work as possible in a single statement!
>>
>
> Long statements are not* clear* statements. The more a statement does,
> the less easy it is to figure out what it's doing.
>
> We didn't add initializers to `if`, `switch`, and range `for` to make them
> "do as much work as possible". It was done to make code less brittle
> ("solving" the temporary range issue) or to deal with cases where you need
> to compute a value, test if its valid, and then use it in an `if`
> statement.
>
> This is the principle downside to me of allowing variables of different
> types in `auto`: that it will encourage people to declare every variable in
> a block in one statement, even when it isn't necessary.
>
I will rephrase - with init-if and init-range-for, this feature will have
even more uses. And by uses, I mean legitimate ones.
If a variable is used in scope *only* *and* it *must* be created before the
if/for/switch statement, then the init section is its best place.
I also don't consider comma separated list of variables declarations worse
then line by line ones.
And one more thing - people are *already* doing it the ugly way!
auto i = std::size_t(0), first = begin(v), last = end(v)
will *prevent* writing this
auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v), end(v))
which we both agree is worse!
> It looks to me the disallow is just legacy "compatibility" mode - to let
>> auto be optional.
>>
>
> `auto` is optional; adding this will not make it any less optional. I
> don't know what you mean by this.
>
Humm, you mean that we simply allow comma separated list to evaluate to
different variable types?
Because otherwise, if this is added, auto is no longer optional, like it is
today.
auto i=2, j=3; *//< 'auto' is optional, can be replaced with int*
auto s="hi"s, i=1; *//< auto is not optional, code will break if changed to
anything else*
I really doubt anyone will have a problem with the fact auto is not
optional, though.
>
>> I also can't imagine how this can break existing code, as there is no
>> conversion/promotion right now - the types must be exactly the same - but
>> as said, this must be investigated.
>>
>>
>> Can someone write a paper, if one is not already written, to get the
>> ball rolling? Nicol Bolas? Giovanni Piero Deretta?
>>
>
> I'm not going to do it because I genuinely don't really want to see this
> happen. See the above for reasons why.
>
> But if some form of multiple deduction is going to happen, then this is
> the correct form for it to take (rather than (ab)using "structured binding"
> syntax).
>
> I read, this was "voted against", but that was 10+ years ago, I imagine,
>> and it is perfectly OK to be conservative on the first iteration of the
>> feature (let auto be optional),
>> but as I said, *now is the best time* to re-investigate the issue! At
>> last we should have paper and hear some arguments against, because I can't
>> think of any deal-breaking.
>>
>
--
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/17a9bc15-da30-4d83-8a50-c1c61feb20ae%40isocpp.org.
------=_Part_11715_744114806.1515342319611
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, January 7, 2018 at 5:12:29 PM UTC+2, Ni=
col Bolas 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"lt=
r">On Sunday, January 7, 2018 at 7:48:37 AM UTC-5, <a>mihailn...@gmail.com<=
/a> 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"><div>Now=
it seems <i>the best</i> time to investigate the possibility for <font fac=
e=3D"courier new,monospace">auto</font> to being able to declare multiple, =
comma separated, variables.</div><div><br></div><div>With the new init if, =
and the new init range-for - we <i>should</i> be able to do as much work as=
possible in a single statement!</div></div></blockquote><div><br></div><di=
v>Long statements are not<i> clear</i> statements. The more a statement doe=
s, the less easy it is to figure out what it's doing.</div><div><br></d=
iv><div>We didn't add initializers to `if`, `switch`, and range `for` t=
o make them "do as much work as possible". It was done to make co=
de less brittle ("solving" the temporary range issue) or to deal =
with cases where you need to compute a value, test if its valid, and then u=
se it in an `if` statement.=C2=A0</div></div></blockquote><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"><div><br></div><div>This is th=
e principle downside to me of allowing variables of different types in `aut=
o`: that it will encourage people to declare every variable in a block in o=
ne statement, even when it isn't necessary.</div></div></blockquote><di=
v><br></div><div><span style=3D"display: inline !important; float: none; ba=
ckground-color: transparent; color: rgb(34, 34, 34); font-family: "Ari=
al","Helvetica",sans-serif; font-size: 13px; font-style: nor=
mal; font-variant: normal; font-weight: 400; letter-spacing: normal; orphan=
s: 2; text-align: left; text-decoration: none; text-indent: 0px; text-trans=
form: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spaci=
ng: 0px;">I will rephrase - with init-if and init-range-for, this feature w=
ill have even more uses. And by uses, I mean legitimate ones. </span></div>=
<div><span style=3D"display: inline !important; float: none; background-col=
or: transparent; color: rgb(34, 34, 34); font-family: "Arial",&qu=
ot;Helvetica",sans-serif; font-size: 13px; font-style: normal; font-va=
riant: normal; font-weight: 400; letter-spacing: normal; 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;"><b=
r></span></div><div>If<span style=3D"display: inline !important; float: non=
e; background-color: transparent; color: rgb(34, 34, 34); font-family: &quo=
t;Arial","Helvetica",sans-serif; font-size: 13px; font-style=
: normal; font-variant: normal; font-weight: 400; letter-spacing: normal; o=
rphans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-=
transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-=
spacing: 0px;"> a variable is used in scope <i>only</i> <b>and</b> it <i>mu=
st</i> be created before the if/for/switch statement, then the init section=
is its best place. </span></div><div><span style=3D"display: inline !impor=
tant; float: none; background-color: transparent; color: rgb(34, 34, 34); f=
ont-family: "Arial","Helvetica",sans-serif; font-size: =
13px; font-style: normal; font-variant: normal; font-weight: 400; letter-sp=
acing: normal; orphans: 2; text-align: left; text-decoration: none; text-in=
dent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-spac=
e: normal; word-spacing: 0px;">I also don't consider comma separated li=
st of variables declarations worse then line by line ones.</span></div><div=
><span style=3D"display: inline !important; float: none; background-color: =
transparent; color: rgb(34, 34, 34); font-family: "Arial","H=
elvetica",sans-serif; font-size: 13px; font-style: normal; font-varian=
t: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align=
: left; text-decoration: none; text-indent: 0px; text-transform: none; -web=
kit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><br></=
span></div><div><span style=3D"display: inline !important; float: none; bac=
kground-color: transparent; color: rgb(34, 34, 34); font-family: "Aria=
l","Helvetica",sans-serif; font-size: 13px; font-style: norm=
al; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans=
: 2; text-align: left; text-decoration: none; text-indent: 0px; text-transf=
orm: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacin=
g: 0px;">And one more thing - people are <i>already</i> doing it the ugly w=
ay!</span></div><div><span style=3D"display: inline !important; float: none=
; background-color: transparent; color: rgb(34, 34, 34); font-family: "=
;Arial","Helvetica",sans-serif; font-size: 13px; font-style:=
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; or=
phans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-t=
ransform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-s=
pacing: 0px;"><br></span></div><div><span style=3D"text-align: left; color:=
rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: n=
ormal; font-family: "Arial","Helvetica",sans-serif; fon=
t-size: 13px; font-variant: normal; word-spacing: 0px; display: inline !imp=
ortant; white-space: normal; orphans: 2; float: none; -webkit-text-stroke-w=
idth: 0px; background-color: transparent;"><span style=3D"display: inline !=
important; float: none; background-color: transparent; color: rgb(34, 34, 3=
4); font-family: courier new,monospace; font-size: 13px; font-style: normal=
; font-variant: normal; font-weight: 400; letter-spacing: normal; orphans: =
2; text-align: left; text-decoration: none; text-indent: 0px; text-transfor=
m: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing:=
0px;">auto i =3D <span style=3D"display: inline !important; float: none; b=
ackground-color: transparent; color: rgb(34, 34, 34); font-family: courier =
new,monospace; font-size: 13px; font-style: normal; font-variant: normal; f=
ont-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text=
-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-str=
oke-width: 0px; white-space: normal; word-spacing: 0px;">std::size_t(0)</sp=
an>, first =3D <span style=3D"display: inline !important; float: none; back=
ground-color: transparent; color: rgb(34, 34, 34); font-family: courier new=
,monospace; font-size: 13px; font-style: normal; font-variant: normal; font=
-weight: 400; letter-spacing: normal; orphans: 2; text-align: left; text-de=
coration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke=
-width: 0px; white-space: normal; word-spacing: 0px;">begin(v)</span>, last=
=3D end(v)</span></span></div><span style=3D"display: inline !important; f=
loat: none; background-color: transparent; color: rgb(34, 34, 34); font-fam=
ily: "Arial","Helvetica",sans-serif; font-size: 13px; f=
ont-style: normal; font-variant: normal; font-weight: 400; letter-spacing: =
normal; orphans: 2; text-align: left; text-decoration: none; text-indent: 0=
px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: norm=
al; word-spacing: 0px;"><div><br></div><div>will <i>prevent</i> writing thi=
s</div><div><br></div></span><div><font face=3D"courier new,monospace">auto=
[i, first, last] =3D std::make_tuple(std::size_t(0), begin(v), end(v))</fo=
nt><span style=3D"display: inline !important; float: none; background-color=
: transparent; color: rgb(34, 34, 34); font-family: "Arial","=
;Helvetica",sans-serif; font-size: 13px; font-style: normal; font-vari=
ant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-ali=
gn: left; text-decoration: none; text-indent: 0px; text-transform: none; -w=
ebkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"></sp=
an></div><div><b><i><br></i></b></div><div>which we both agree is worse!<b>=
</b><i></i><br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" sty=
le=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left=
: 1ex;"><div dir=3D"ltr"><div><i></i></div><blockquote class=3D"gmail_quote=
" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-le=
ft:1ex"><div dir=3D"ltr"><div>It looks to me the disallow is just legacy &q=
uot;compatibility" mode - to let auto be optional.</div></div></blockq=
uote><div><br></div><div>`auto` is optional; adding this will not make it a=
ny less optional. I don't know what you mean by this.</div></div></bloc=
kquote><div><br></div><div>Humm, you mean that we simply allow comma separa=
ted list to evaluate to different variable types?</div><div><br></div><div>=
Because otherwise, if this is added, <font face=3D"courier new,monospace">a=
uto</font> is no longer optional, like it is today.</div><div><br></div><di=
v><font face=3D"courier new,monospace">auto i=3D2, j=3D3; <i>//< 'au=
to' is optional, can be replaced with int</i></font></div><div><font fa=
ce=3D"courier new"><i><br></i></font></div><div><font face=3D"courier new">=
<span style=3D"display: inline !important; float: none; background-color: t=
ransparent; color: rgb(34, 34, 34); font-family: courier new,monospace; fon=
t-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; l=
etter-spacing: normal; orphans: 2; text-align: left; text-decoration: none;=
text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; wh=
ite-space: normal; word-spacing: 0px;">auto s=3D"hi"s, i=3D1; <i>=
//< auto is not optional, code will break if changed to anything else</i=
></span></font></div><div><font face=3D"courier new"><span style=3D"display=
: inline !important; float: none; background-color: transparent; color: rgb=
(34, 34, 34); font-family: courier new,monospace; font-size: 13px; font-sty=
le: normal; font-variant: normal; font-weight: 400; letter-spacing: normal;=
orphans: 2; text-align: left; text-decoration: none; text-indent: 0px; tex=
t-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wor=
d-spacing: 0px;">=C2=A0</span></font></div><div><span style=3D"text-align: =
left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; lette=
r-spacing: normal; font-size: 13px; font-style: normal; font-variant: norma=
l; font-weight: 400; text-decoration: none; word-spacing: 0px; display: inl=
ine !important; white-space: normal; orphans: 2; float: none; -webkit-text-=
stroke-width: 0px; background-color: transparent;"><font face=3D"arial,sans=
-serif">I really doubt anyone will have a problem with the fact auto is not=
optional, though.</font></span><font face=3D"arial,sans-serif"><span style=
=3D"display: inline !important; float: none; background-color: transparent;=
color: rgb(34, 34, 34); font-family: courier new,monospace; 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;"></span></font></div><div><br></div><blockquote =
class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1p=
x #ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>=C2=A0</div><blockqu=
ote 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"><div>I also can't imag=
ine how this can break existing code, as there is no conversion/promotion r=
ight now - the types must be exactly the same - but as said, this must be i=
nvestigated.</div><div><br></div><div><br></div><div>Can someone write a pa=
per,=C2=A0<span style=3D"display:inline!important;float:none;background-col=
or:transparent;color:rgb(34,34,34);font-family:"Arial","Helv=
etica",sans-serif;font-size:13px;font-style:normal;font-variant:normal=
;font-weight:400;letter-spacing:normal;text-align:left;text-decoration:none=
;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">i=
f one is not already written, to get the ball rolling?=C2=A0<span style=3D"=
display:inline!important;float:none;background-color:transparent;color:rgb(=
34,34,34);font-family:"Arial","Helvetica",sans-serif;fo=
nt-size:13px;font-style:normal;font-variant:normal;font-weight:400;letter-s=
pacing:normal;text-align:left;text-decoration:none;text-indent:0px;text-tra=
nsform:none;white-space:normal;word-spacing:0px">Nicol Bolas? Giovanni Pier=
o Deretta?</span></span></div></div></blockquote><div><br></div><div>I'=
m not going to do it because I genuinely don't really want to see this =
happen. See the above for reasons why.</div><div><br></div><div>But if some=
form of multiple deduction is going to happen, then this is the correct fo=
rm for it to take (rather than (ab)using "structured binding" syn=
tax).</div></div></blockquote><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><blockquote class=3D"gmail_quote" style=3D"=
margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><di=
v dir=3D"ltr"><div>I read, this was "voted against", but that was=
10+ years ago, I imagine, and it is perfectly OK to be conservative on the=
first iteration of the feature (let auto be optional),</div><div> but as I=
said, <i>now is the best time</i> to re-investigate the issue! At last we =
should have paper and hear some arguments against, because I can't thin=
k of any deal-breaking.<br></div></div></blockquote></div></blockquote><div=
><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/17a9bc15-da30-4d83-8a50-c1c61feb20ae%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/17a9bc15-da30-4d83-8a50-c1c61feb20ae=
%40isocpp.org</a>.<br />
------=_Part_11715_744114806.1515342319611--
------=_Part_11714_282904332.1515342319610--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Sun, 7 Jan 2018 16:53:55 +0000
Raw View
--001a113d2b7802084d0562328742
Content-Type: text/plain; charset="UTF-8"
On 7 Jan 2018 16:19, "Patrice Roy" <patricer@gmail.com> wrote:
I don't think it's a matter of sentence length in the standard text. It's
more a matter of :
int a = 2, b = 3; // same type
auto x = "hello"s, y = 3.14159; // distinct types, quite new; impact on the
way people write C++? Requires thought, at the very least
Depends. It seems more natural to me.
int a = 1, b = 2, c = 3; //a,b,c all ints
auto x = 4, y = "thing"s, z = std::make_shared<thing>(param); // x, y, z
all automatically deducted.
It isn't the first big difference either:
auto a=1, b=1.2; // compiler error
int a=1, b=1.2; // implicit cast used.
As such, just one more distinction between the two is reasonable. As far as
I'm concerned they're different statements, and holding onto similarities
for similarity's sake, when there are already big enough distinctions, is
an unnecessary hurdle.
--
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/CAC%2B0CCP0ucg8kpyJrDDk46dN7muofFg7TsFMg9YON0w0_piZmg%40mail.gmail.com.
--001a113d2b7802084d0562328742
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto"><div><br><div class=3D"gmail_extra"><br><div class=3D"gma=
il_quote">On 7 Jan 2018 16:19, "Patrice Roy" <<a href=3D"mailt=
o:patricer@gmail.com">patricer@gmail.com</a>> wrote:<br type=3D"attribut=
ion"><blockquote class=3D"quote" style=3D"margin:0 0 0 .8ex;border-left:1px=
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><div dir=3D"auto"><div><div>=
I don't think it's a matter of sentence length in the standard text=
.. It's more a matter of :<br><br></div>int a =3D 2, b =3D 3; // same ty=
pe<br></div>auto x =3D "hello"s, y =3D 3.14159; // distinct types=
, quite new; impact on the way people write C++? Requires thought, at the v=
ery least<br></div></div></blockquote></div></div></div><div dir=3D"auto"><=
br></div><div dir=3D"auto">Depends. It seems more natural to me.</div><div =
dir=3D"auto"><br></div><div dir=3D"auto">int a =3D 1, b =3D 2, c =3D 3; //a=
,b,c all ints</div><div dir=3D"auto">auto x =3D 4, y =3D "thing"s=
, z =3D std::make_shared<thing>(param); // x, y, z all automatically =
deducted.</div><div dir=3D"auto"><br></div><div dir=3D"auto">It isn't t=
he first big difference either:</div><div dir=3D"auto"><br></div><div dir=
=3D"auto">auto a=3D1, b=3D1.2; // compiler error</div><div dir=3D"auto">int=
a=3D1, b=3D1.2; // implicit cast used.</div><div dir=3D"auto"><br></div><d=
iv dir=3D"auto">As such, just one more distinction between the two is reaso=
nable. As far as I'm concerned they're different statements, and ho=
lding onto similarities for similarity's sake, when there are already b=
ig enough distinctions, is an unnecessary hurdle.=C2=A0</div><div dir=3D"au=
to"></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCP0ucg8kpyJrDDk46dN7muofFg7Ts=
FMg9YON0w0_piZmg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCP0ucg8=
kpyJrDDk46dN7muofFg7TsFMg9YON0w0_piZmg%40mail.gmail.com</a>.<br />
--001a113d2b7802084d0562328742--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sun, 7 Jan 2018 19:19:13 +0200
Raw View
On 7 January 2018 at 18:19, Patrice Roy <patricer@gmail.com> wrote:
> template <Regular T> void f(T, T); // same type
> void g(Regular, Regular); // if short syntax eventually gets in : same type?
> different types?
> void h(auto a, auto b); // same rules as Regular,Regular or not? Papers have
> been written debating both options
I haven't seen a paper suggesting that h should have two parameters of
the same type,
can you point me to one?
--
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/CAFk2RUYp9mEboC9KM_RG4xhKZ5VESw7dxqLYf-PnMT4_P8-K-g%40mail.gmail.com.
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 7 Jan 2018 09:23:43 -0800 (PST)
Raw View
------=_Part_12135_963473446.1515345823770
Content-Type: multipart/alternative;
boundary="----=_Part_12136_586785631.1515345823770"
------=_Part_12136_586785631.1515345823770
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 11:19:21 AM UTC-5, Patrice Roy wrote:
>
> I don't think it's a matter of sentence length in the standard text. It's
> more a matter of :
>
> int a = 2, b = 3; // same type
> auto x = "hello"s, y = 3.14159; // distinct types, quite new; impact on
> the way people write C++? Requires thought, at the very least
> // ...
> template <Regular T> void f(T, T); // same type
> void g(Regular, Regular); // if short syntax eventually gets in : same
> type? different types?
> void h(auto a, auto b); // same rules as Regular,Regular or not? Papers
> have been written debating both options
>
> If you see single-auto, multiple types as the way to go, I think it's a
> position that deserves a paper. It does not jump as being to path to follow
> in a self-evident manner;
>
Why not?
Why is this "self-evident":
auto [i = std::size_t(0), first = begin(v), last = end(v)];
When this is not "self-evident":
auto i = std::size_t(0), first = begin(v), last = end(v);
Literally the only difference between them is the presence of two brackets.
What are those brackets doing that makes the former code more readable and
reasonable than the latter?
Those brackets usually mean "structured binding". But you're* not doing
structured binding*. You're not decomposing a type; you're creating* new
variables*.
maybe you'll find a convincing angle, and I for one will happily read it
> once it's written. The alternatives seem less contentious to me, given
> prior art,
>
What prior art?
> but I'm open to examining what you have in mind once it's been put in
> proposal form.
>
--
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/20e52a58-1947-4cb9-8ab0-d6a46a064e88%40isocpp.org.
------=_Part_12136_586785631.1515345823770
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, January 7, 2018 at 11:19:21 AM UTC-5, Patrice R=
oy 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"><div=
><div><div><div>I don't think it's a matter of sentence length in t=
he standard text. It's more a matter of :<br><br></div>int a =3D 2, b =
=3D 3; // same type<br></div>auto x =3D "hello"s, y =3D 3.14159; =
// distinct types, quite new; impact on the way people write C++? Requires =
thought, at the very least<br>// ...</div><div>template <Regular T> v=
oid f(T, T); // same type<br></div><div>void g(Regular, Regular); // if sho=
rt syntax eventually gets in : same type? different types?</div><div>void h=
(auto a, auto b); // same rules as Regular,Regular or not? Papers have been=
written debating both options<br></div><div><br></div></div>If you see sin=
gle-auto, multiple types as the way to go, I think it's a position that=
deserves a paper. It does not jump as being to path to follow in a self-ev=
ident manner;</div></blockquote><div><br></div><div>Why not?</div><div><br>=
</div><div>Why is this "self-evident":</div><div><br></div><div c=
lass=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); word-wr=
ap: break-word; background-color: rgb(250, 250, 250);"><code class=3D"prett=
yprint"><div class=3D"subprettyprint"><span class=3D"styled-by-prettify" st=
yle=3D"color: #008;">auto</span><span class=3D"styled-by-prettify" style=3D=
"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #=
660;">[</span><span class=3D"styled-by-prettify" style=3D"color: #000;">i <=
/span><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><=
span class=3D"styled-by-prettify" style=3D"color: #000;"> std</span><span c=
lass=3D"styled-by-prettify" style=3D"color: #660;">::</span><span class=3D"=
styled-by-prettify" style=3D"color: #000;">size_t</span><span class=3D"styl=
ed-by-prettify" style=3D"color: #660;">(</span><span class=3D"styled-by-pre=
ttify" style=3D"color: #066;">0</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #660;">),</span><span class=3D"styled-by-prettify" style=3D"c=
olor: #000;"> first </span><span class=3D"styled-by-prettify" style=3D"colo=
r: #660;">=3D</span><span class=3D"styled-by-prettify" style=3D"color: #000=
;"> </span><span class=3D"styled-by-prettify" style=3D"color: #008;">begin<=
/span><span class=3D"styled-by-prettify" style=3D"color: #660;">(</span><sp=
an class=3D"styled-by-prettify" style=3D"color: #000;">v</span><span class=
=3D"styled-by-prettify" style=3D"color: #660;">),</span><span class=3D"styl=
ed-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-pre=
ttify" style=3D"color: #008;">last</span><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 class=3D"styled-by-prettify" style=3D"color: #008;">e=
nd</span><span class=3D"styled-by-prettify" style=3D"color: #660;">(</span>=
<span class=3D"styled-by-prettify" style=3D"color: #000;">v</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #660;">)];</span></div></code></d=
iv><div><br></div><div>When this is not "self-evident":</div><div=
><br></div><div class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 1=
87, 187); word-wrap: break-word; background-color: rgb(250, 250, 250);"><co=
de class=3D"prettyprint"><div class=3D"subprettyprint"><span class=3D"style=
d-by-prettify" style=3D"color: #008;">auto</span><span class=3D"styled-by-p=
rettify" style=3D"color: #000;"> i </span><span class=3D"styled-by-prettify=
" style=3D"color: #660;">=3D</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> std</span><span class=3D"styled-by-prettify" style=3D"co=
lor: #660;">::</span><span class=3D"styled-by-prettify" style=3D"color: #00=
0;">size_t</span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
(</span><span class=3D"styled-by-prettify" style=3D"color: #066;">0</span><=
span class=3D"styled-by-prettify" style=3D"color: #660;">),</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #000;"> first </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: #008;">begin</span><span class=3D"styled-by-prettif=
y" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;">v</span><span class=3D"styled-by-prettify" style=3D"color=
: #660;">),</span><span class=3D"styled-by-prettify" style=3D"color: #000;"=
> </span><span class=3D"styled-by-prettify" style=3D"color: #008;">last</sp=
an><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 class=3D"style=
d-by-prettify" style=3D"color: #008;">end</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #000;">v</span><span class=3D"styled-by-prettify" style=3D"c=
olor: #660;">);</span></div></code></div><div><div style=3D"background-colo=
r: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-fami=
ly: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; fon=
t-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; l=
etter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px; text-align: left; text-decoration: non=
e; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; =
white-space: normal; word-spacing: 0px;"><span style=3D"background-color: t=
ransparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none=
; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: st=
retch; border-image-slice: 100%; border-image-source: none; border-image-wi=
dth: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-to=
p-style: none; border-top-width: 0px; color: rgb(34, 34, 34); display: inli=
ne; float: none; font-family: &quot;Arial&quot;,&quot;Helvetica=
&quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: n=
ormal; 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: 0px; padding-top: 0px; text-align: =
left; text-decoration: none; text-indent: 0px; text-transform: none; -webki=
t-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><br></sp=
an></div><div style=3D"background-color: transparent; border-bottom-color: =
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(34=
, 34, 34); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: =
0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&qu=
ot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal; fon=
t-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom:=
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; pad=
ding-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: normal; word-spacing: 0p=
x;"><span style=3D"background-color: transparent; border-bottom-color: rgb(=
34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34=
, 34); border-left-style: none; border-left-width: 0px; border-right-color:=
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border=
-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px;=
color: rgb(34, 34, 34); display: inline; float: none; font-family: &qu=
ot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13p=
x; font-style: normal; font-variant: normal; font-weight: 400; letter-spaci=
ng: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px; text-align: left; text-decoration: none; text-ind=
ent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space=
: normal; word-spacing: 0px;">Literally the only difference between them is=
the presence of two brackets. What are those brackets doing that makes the=
former code more readable and reasonable than the latter?</span></div><div=
style=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 3=
4); border-bottom-style: none; border-bottom-width: 0px; border-image-outse=
t: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-=
source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bo=
rder-left-style: none; border-left-width: 0px; border-right-color: rgb(34, =
34, 34); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: r=
gb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&=
amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: no=
rmal; 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: 0px; padding-top: 0px; text-align: l=
eft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit=
-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><br></div=
><div style=3D"background-color: transparent; border-bottom-color: rgb(34, =
34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34=
); border-left-style: none; border-left-width: 0px; border-right-color: rgb=
(34, 34, 34); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; col=
or: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helve=
tica&quot;,sans-serif; font-size: 13px; font-style: normal; font-varian=
t: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; ma=
rgin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bot=
tom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-ali=
gn: left; text-decoration: none; text-indent: 0px; text-transform: none; -w=
ebkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">Thos=
e brackets usually mean "structured binding". But you're<i> n=
ot doing structured binding</i>. You're not decomposing a type; you'=
;re creating<i> new variables</i>.</div><b></b></div><div><i><br></i></div>=
<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">maybe you'=
;ll find a convincing angle, and I for one will happily read it once it'=
;s written. The alternatives seem less contentious to me, given prior art,<=
/div></blockquote><div><br></div><div>What prior art?</div><div>=C2=A0</div=
><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;bo=
rder-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"ltr">but I'm =
open to examining what you have in mind once it's been put in proposal =
form.<br></div></blockquote><div>=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" 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/20e52a58-1947-4cb9-8ab0-d6a46a064e88%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/20e52a58-1947-4cb9-8ab0-d6a46a064e88=
%40isocpp.org</a>.<br />
------=_Part_12136_586785631.1515345823770--
------=_Part_12135_963473446.1515345823770--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 7 Jan 2018 09:25:09 -0800 (PST)
Raw View
------=_Part_11928_618502590.1515345909466
Content-Type: multipart/alternative;
boundary="----=_Part_11929_48467527.1515345909466"
------=_Part_11929_48467527.1515345909466
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 12:19:16 PM UTC-5, Ville Voutilainen wrote:
>
> On 7 January 2018 at 18:19, Patrice Roy <patr...@gmail.com <javascript:>>
> wrote:
> > template <Regular T> void f(T, T); // same type
> > void g(Regular, Regular); // if short syntax eventually gets in : same
> type?
> > different types?
> > void h(auto a, auto b); // same rules as Regular,Regular or not? Papers
> have
> > been written debating both options
>
> I haven't seen a paper suggesting that h should have two parameters of
> the same type,
> can you point me to one?
>
Equally importantly, `[](auto a, auto b)` already *doesn't do this*. So any
such paper is going to have a hell of a mountain to climb to explain *that*
inconsistency.
--
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/5e87d74e-d9be-418f-99bb-464289fd1950%40isocpp.org.
------=_Part_11929_48467527.1515345909466
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, January 7, 2018 at 12:19:16 PM UTC-5, V=
ille Voutilainen wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0=
;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On 7 Ja=
nuary 2018 at 18:19, Patrice Roy <<a onmousedown=3D"this.href=3D'jav=
ascript:';return true;" onclick=3D"this.href=3D'javascript:';re=
turn true;" href=3D"javascript:" target=3D"_blank" rel=3D"nofollow" gdf-obf=
uscated-mailto=3D"NvdTLtSfEAAJ">patr...@gmail.com</a>> wrote:
<br>> template <Regular T> void f(T, T); // same type
<br>> void g(Regular, Regular); // if short syntax eventually gets in : =
same type?
<br>> different types?
<br>> void h(auto a, auto b); // same rules as Regular,Regular or not? P=
apers have
<br>> been written debating both options
<br>
<br>I haven't seen a paper suggesting that h should have two parameters=
of
<br>the same type,
<br>can you point me to one?
<br></blockquote><div><br></div><div>Equally importantly, `[](auto a, auto =
b)` already <i>doesn't do this</i>. So any such paper is going to have =
a hell of a mountain to climb to explain <i>that</i> inconsistency.=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" 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/5e87d74e-d9be-418f-99bb-464289fd1950%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/5e87d74e-d9be-418f-99bb-464289fd1950=
%40isocpp.org</a>.<br />
------=_Part_11929_48467527.1515345909466--
------=_Part_11928_618502590.1515345909466--
.
Author: Ville Voutilainen <ville.voutilainen@gmail.com>
Date: Sun, 7 Jan 2018 19:29:51 +0200
Raw View
On 7 January 2018 at 19:25, Nicol Bolas <jmckesson@gmail.com> wrote:
>
>
> On Sunday, January 7, 2018 at 12:19:16 PM UTC-5, Ville Voutilainen wrote:
>>
>> On 7 January 2018 at 18:19, Patrice Roy <patr...@gmail.com> wrote:
>> > template <Regular T> void f(T, T); // same type
>> > void g(Regular, Regular); // if short syntax eventually gets in : same
>> > type?
>> > different types?
>> > void h(auto a, auto b); // same rules as Regular,Regular or not? Papers
>> > have
>> > been written debating both options
>>
>> I haven't seen a paper suggesting that h should have two parameters of
>> the same type,
>> can you point me to one?
>
>
> Equally importantly, `[](auto a, auto b)` already doesn't do this. So any
> such paper is going to have a hell of a mountain to climb to explain that
> inconsistency.
Which is why I proposed allowing 'void f(auto, auto);' and suggested
that the committee
has already made its bed on it. Various people claimed they wish to
see what the outcome
of the terse syntax discussion is; they remain mistaken.
--
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/CAFk2RUbbWbvKY_z%2BDQa4dh6FbU4n%3DCic%2Bd5WnaqVu4_dnn%3D0xg%40mail.gmail.com.
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 7 Jan 2018 09:39:06 -0800 (PST)
Raw View
------=_Part_12093_1834222699.1515346746994
Content-Type: multipart/alternative;
boundary="----=_Part_12094_449636315.1515346746995"
------=_Part_12094_449636315.1515346746995
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 11:25:19 AM UTC-5, mihailn...@gmail.com wrote:
>
> On Sunday, January 7, 2018 at 5:12:29 PM UTC+2, Nicol Bolas wrote:
>>
>> On Sunday, January 7, 2018 at 7:48:37 AM UTC-5, mihailn...@gmail.com
>> wrote:
>>>
>>> Now it seems *the best* time to investigate the possibility for auto to
>>> being able to declare multiple, comma separated, variables.
>>>
>>> With the new init if, and the new init range-for - we *should* be able
>>> to do as much work as possible in a single statement!
>>>
>>
>> Long statements are not* clear* statements. The more a statement does,
>> the less easy it is to figure out what it's doing.
>>
>> We didn't add initializers to `if`, `switch`, and range `for` to make
>> them "do as much work as possible". It was done to make code less brittle
>> ("solving" the temporary range issue) or to deal with cases where you need
>> to compute a value, test if its valid, and then use it in an `if`
>> statement.
>>
>
>> This is the principle downside to me of allowing variables of different
>> types in `auto`: that it will encourage people to declare every variable in
>> a block in one statement, even when it isn't necessary.
>>
>
> I will rephrase - with init-if and init-range-for, this feature will have
> even more uses. And by uses, I mean legitimate ones.
>
> If a variable is used in scope *only* *and* it *must* be created before
> the if/for/switch statement, then the init section is its best place.
> I also don't consider comma separated list of variables declarations worse
> then line by line ones.
>
> And one more thing - people are *already* doing it the ugly way!
>
> auto i = std::size_t(0), first = begin(v), last = end(v)
>
> will *prevent* writing this
>
> auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v), end(v))
>
> which we both agree is worse!
>
If people are writing that, then they* deserve* to write it. That's my
feeling on the matter. Let's make ugly code as ugly as possible, so that
people will switch to the better code.
Turning this:
for( auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v), end(v
));
first != last;
++i, ++first)
{
std::cout << "index: " << i << "\t" << *first << "\n";
}
into this:
for( auto i = std::size_t(0), first = begin(v), last = end(v);
first != last;
++i, ++first)
{
std::cout << "index: " << i << "\t" << *first << "\n";
}
doesn't really help a whole lot. The latter has 80% of the ugliness of the
former. We should encourage people to build tools that allow them to write
this instead:
for(auto &[i, val] : std::counted_view(rng))
{
std::cout << "index: " << i << "\t" << val << "\n";
}
It's shorter. It's nearly impossible to get wrong. It makes it clear what's
going on. Etc.
Most of the "legitimate uses" of this feature can be rewritten in better
ways. The few cases that can't be rewritten? Well, I can live with them.
It looks to me the disallow is just legacy "compatibility" mode - to let
>>> auto be optional.
>>>
>>
>> `auto` is optional; adding this will not make it any less optional. I
>> don't know what you mean by this.
>>
>
> Humm, you mean that we simply allow comma separated list to evaluate to
> different variable types?
>
Because otherwise, if this is added, auto is no longer optional, like it is
> today.
>
> auto i=2, j=3; *//< 'auto' is optional, can be replaced with int*
>
> auto s="hi"s, i=1; *//< auto is not optional, code will break if changed
> to anything else*
>
>
I think your "optional" terminology here is confusing. It's more that it is
"replaceable"; what you're talking about is the fact that there is some
type that you can always substitute in for `auto` declarations and get the
same effect.
Yes, this syntax would remove the replicability of auto in such
declarations.
> I really doubt anyone will have a problem with the fact auto is not
> optional, though.
>
--
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/7bb5e8c0-dcd4-42ff-a431-d11f3690d6b2%40isocpp.org.
------=_Part_12094_449636315.1515346746995
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, January 7, 2018 at 11:25:19 AM UTC-5, mihailn..=
..@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, January 7, 2018 at 5:12:29 PM UTC+2, Nicol Bolas wrote:<blo=
ckquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-le=
ft:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">On Sunday, January 7, =
2018 at 7:48:37 AM UTC-5, <a>mihailn...@gmail.com</a> wrote:<blockquote cla=
ss=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc=
solid;padding-left:1ex"><div dir=3D"ltr"><div>Now it seems <i>the best</i>=
time to investigate the possibility for <font face=3D"courier new,monospac=
e">auto</font> to being able to declare multiple, comma separated, variable=
s.</div><div><br></div><div>With the new init if, and the new init range-fo=
r - we <i>should</i> be able to do as much work as possible in a single sta=
tement!</div></div></blockquote><div><br></div><div>Long statements are not=
<i> clear</i> statements. The more a statement does, the less easy it is to=
figure out what it's doing.</div><div><br></div><div>We didn't add=
initializers to `if`, `switch`, and range `for` to make them "do as m=
uch work as possible". It was done to make code less brittle ("so=
lving" the temporary range issue) or to deal with cases where you need=
to compute a value, test if its valid, and then use it in an `if` statemen=
t.=C2=A0</div></div></blockquote><blockquote class=3D"gmail_quote" style=3D=
"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex"><d=
iv dir=3D"ltr"><div><br></div><div>This is the principle downside to me of =
allowing variables of different types in `auto`: that it will encourage peo=
ple to declare every variable in a block in one statement, even when it isn=
't necessary.</div></div></blockquote><div><br></div><div><span style=
=3D"display:inline!important;float:none;background-color:transparent;color:=
rgb(34,34,34);font-family:"Arial","Helvetica",sans-seri=
f;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;lett=
er-spacing:normal;text-align:left;text-decoration:none;text-indent:0px;text=
-transform:none;white-space:normal;word-spacing:0px">I will rephrase - with=
init-if and init-range-for, this feature will have even more uses. And by =
uses, I mean legitimate ones. </span></div><div><span style=3D"display:inli=
ne!important;float:none;background-color:transparent;color:rgb(34,34,34);fo=
nt-family:"Arial","Helvetica",sans-serif;font-size:13px=
;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:norma=
l;text-align:left;text-decoration:none;text-indent:0px;text-transform:none;=
white-space:normal;word-spacing:0px"><br></span></div><div>If<span style=3D=
"display:inline!important;float:none;background-color:transparent;color:rgb=
(34,34,34);font-family:"Arial","Helvetica",sans-serif;f=
ont-size:13px;font-style:normal;font-variant:normal;font-weight:400;letter-=
spacing:normal;text-align:left;text-decoration:none;text-indent:0px;text-tr=
ansform:none;white-space:normal;word-spacing:0px"> a variable is used in sc=
ope <i>only</i> <b>and</b> it <i>must</i> be created before the if/for/swit=
ch statement, then the init section is its best place. </span></div><div><s=
pan style=3D"display:inline!important;float:none;background-color:transpare=
nt;color:rgb(34,34,34);font-family:"Arial","Helvetica",=
sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-weight=
:400;letter-spacing:normal;text-align:left;text-decoration:none;text-indent=
:0px;text-transform:none;white-space:normal;word-spacing:0px">I also don=
9;t consider comma separated list of variables declarations worse then line=
by line ones.</span></div><div><span style=3D"display:inline!important;flo=
at:none;background-color:transparent;color:rgb(34,34,34);font-family:"=
Arial","Helvetica",sans-serif;font-size:13px;font-style:norm=
al;font-variant:normal;font-weight:400;letter-spacing:normal;text-align:lef=
t;text-decoration:none;text-indent:0px;text-transform:none;white-space:norm=
al;word-spacing:0px"><br></span></div><div><span style=3D"display:inline!im=
portant;float:none;background-color:transparent;color:rgb(34,34,34);font-fa=
mily:"Arial","Helvetica",sans-serif;font-size:13px;font=
-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;tex=
t-align:left;text-decoration:none;text-indent:0px;text-transform:none;white=
-space:normal;word-spacing:0px">And one more thing - people are <i>already<=
/i> doing it the ugly way!</span></div><div><span style=3D"display:inline!i=
mportant;float:none;background-color:transparent;color:rgb(34,34,34);font-f=
amily:"Arial","Helvetica",sans-serif;font-size:13px;fon=
t-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;te=
xt-align:left;text-decoration:none;text-indent:0px;text-transform:none;whit=
e-space:normal;word-spacing:0px"><br></span></div><div><span style=3D"text-=
align:left;color:rgb(34,34,34);text-transform:none;text-indent:0px;letter-s=
pacing:normal;font-family:"Arial","Helvetica",sans-seri=
f;font-size:13px;font-variant:normal;word-spacing:0px;display:inline!import=
ant;white-space:normal;float:none;background-color:transparent"><span style=
=3D"display:inline!important;float:none;background-color:transparent;color:=
rgb(34,34,34);font-family:courier new,monospace;font-size:13px;font-style:n=
ormal;font-variant:normal;font-weight:400;letter-spacing:normal;text-align:=
left;text-decoration:none;text-indent:0px;text-transform:none;white-space:n=
ormal;word-spacing:0px">auto i =3D <span style=3D"display:inline!important;=
float:none;background-color:transparent;color:rgb(34,34,34);font-family:cou=
rier new,monospace;font-size:13px;font-style:normal;font-variant:normal;fon=
t-weight:400;letter-spacing:normal;text-align:left;text-decoration:none;tex=
t-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">std::=
size_t(0)</span>, first =3D <span style=3D"display:inline!important;float:n=
one;background-color:transparent;color:rgb(34,34,34);font-family:courier ne=
w,monospace;font-size:13px;font-style:normal;font-variant:normal;font-weigh=
t:400;letter-spacing:normal;text-align:left;text-decoration:none;text-inden=
t:0px;text-transform:none;white-space:normal;word-spacing:0px">begin(v)</sp=
an>, last =3D end(v)</span></span></div><span style=3D"display:inline!impor=
tant;float:none;background-color:transparent;color:rgb(34,34,34);font-famil=
y:"Arial","Helvetica",sans-serif;font-size:13px;font-st=
yle:normal;font-variant:normal;font-weight:400;letter-spacing:normal;text-a=
lign:left;text-decoration:none;text-indent:0px;text-transform:none;white-sp=
ace:normal;word-spacing:0px"><div><br></div><div>will <i>prevent</i> writin=
g this</div><div><br></div></span><div><font face=3D"courier new,monospace"=
>auto [i, first, last] =3D std::make_tuple(std::size_t(0)<wbr>, begin(v), e=
nd(v))</font><span style=3D"display:inline!important;float:none;background-=
color:transparent;color:rgb(34,34,34);font-family:"Arial","H=
elvetica",sans-serif;font-size:13px;font-style:normal;font-variant:nor=
mal;font-weight:400;letter-spacing:normal;text-align:left;text-decoration:n=
one;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px=
"></span></div><div><b><i><br></i></b></div><div>which we both agree is wor=
se!</div></div></blockquote><div><br></div><div>If people are writing that,=
then they<i> deserve</i> to write it. That's my feeling on the matter.=
Let's make ugly code as ugly as possible, so that people will switch t=
o the better code.</div><div><br></div><div>Turning this:</div><div><br></d=
iv><div><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"styled-b=
y-prettify" style=3D"color: #008;">for</span><span class=3D"styled-by-prett=
ify" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" styl=
e=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"colo=
r: #008;">auto</span><span class=3D"styled-by-prettify" style=3D"color: #00=
0;"> </span><span class=3D"styled-by-prettify" style=3D"color: #660;">[</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #000;">i</span><span =
class=3D"styled-by-prettify" style=3D"color: #660;">,</span><span class=3D"=
styled-by-prettify" style=3D"color: #000;"> first</span><span class=3D"styl=
ed-by-prettify" style=3D"color: #660;">,</span><span class=3D"styled-by-pre=
ttify" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" st=
yle=3D"color: #008;">last</span><span class=3D"styled-by-prettify" style=3D=
"color: #660;">]</span><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;"> std</span=
><span class=3D"styled-by-prettify" style=3D"color: #660;">::</span><span c=
lass=3D"styled-by-prettify" style=3D"color: #000;">make_tuple</span><span c=
lass=3D"styled-by-prettify" style=3D"color: #660;">(</span><span class=3D"s=
tyled-by-prettify" style=3D"color: #000;">std</span><span class=3D"styled-b=
y-prettify" style=3D"color: #660;">::</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #000;">size_t</span><span class=3D"styled-by-prettify" =
style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=3D"=
color: #066;">0</span><span class=3D"styled-by-prettify" style=3D"color: #6=
60;">),</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </=
span><span class=3D"styled-by-prettify" style=3D"color: #008;">begin</span>=
<span class=3D"styled-by-prettify" style=3D"color: #660;">(</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #000;">v</span><span class=3D"sty=
led-by-prettify" style=3D"color: #660;">),</span><span class=3D"styled-by-p=
rettify" style=3D"color: #000;"> </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"styled-by-prettify" style=3D"color=
: #000;">v</span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
));</span><span class=3D"styled-by-prettify" style=3D"color: #000;"><br>=C2=
=A0 first </span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
!=3D</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </spa=
n><span class=3D"styled-by-prettify" style=3D"color: #008;">last</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #660;">;</span><span class=
=3D"styled-by-prettify" style=3D"color: #000;"><br>=C2=A0 </span><span clas=
s=3D"styled-by-prettify" style=3D"color: #660;">++</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;">i</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #660;">,</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"c=
olor: #660;">++</span><span class=3D"styled-by-prettify" style=3D"color: #0=
00;">first</span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
)</span><span class=3D"styled-by-prettify" style=3D"color: #000;"><br></spa=
n><span class=3D"styled-by-prettify" style=3D"color: #660;">{</span><span c=
lass=3D"styled-by-prettify" style=3D"color: #000;"><br>=C2=A0std</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #660;">::</span><span class=
=3D"styled-by-prettify" style=3D"color: #000;">cout </span><span class=3D"s=
tyled-by-prettify" style=3D"color: #660;"><<</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-pr=
ettify" style=3D"color: #080;">"index: "</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-pr=
ettify" style=3D"color: #660;"><<</span><span class=3D"styled-by-pret=
tify" style=3D"color: #000;"> i </span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #660;"><<</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"col=
or: #080;">"\t"</span><span class=3D"styled-by-prettify" style=3D=
"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #=
660;"><<</span><span class=3D"styled-by-prettify" style=3D"color: #00=
0;"> </span><span class=3D"styled-by-prettify" style=3D"color: #660;">*</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #000;">first </span><=
span class=3D"styled-by-prettify" style=3D"color: #660;"><<</span><sp=
an class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=
=3D"styled-by-prettify" style=3D"color: #080;">"\n"</span><span c=
lass=3D"styled-by-prettify" style=3D"color: #660;">;</span><span class=3D"s=
tyled-by-prettify" style=3D"color: #000;"><br></span><span class=3D"styled-=
by-prettify" style=3D"color: #660;">}</span></div></code></div></div><div><=
br></div><div>into this:</div><div><br></div><div class=3D"prettyprint" sty=
le=3D"border: 1px solid rgb(187, 187, 187); word-wrap: break-word; backgrou=
nd-color: rgb(250, 250, 250);"><code class=3D"prettyprint"><div class=3D"su=
bprettyprint"><span class=3D"styled-by-prettify" style=3D"color: #008;">for=
</span><span class=3D"styled-by-prettify" style=3D"color: #660;">(</span><s=
pan class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=
=3D"styled-by-prettify" style=3D"color: #008;">auto</span><span class=3D"st=
yled-by-prettify" style=3D"color: #000;"> i </span><span class=3D"styled-by=
-prettify" style=3D"color: #660;">=3D</span><span class=3D"styled-by-pretti=
fy" style=3D"color: #000;"> std</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #660;">::</span><span class=3D"styled-by-prettify" style=3D"c=
olor: #000;">size_t</span><span class=3D"styled-by-prettify" style=3D"color=
: #660;">(</span><span class=3D"styled-by-prettify" style=3D"color: #066;">=
0</span><span class=3D"styled-by-prettify" style=3D"color: #660;">),</span>=
<span class=3D"styled-by-prettify" style=3D"color: #000;"> first </span><sp=
an class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"styl=
ed-by-prettify" style=3D"color: #008;">begin</span><span class=3D"styled-by=
-prettify" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify=
" style=3D"color: #000;">v</span><span class=3D"styled-by-prettify" style=
=3D"color: #660;">),</span><span class=3D"styled-by-prettify" style=3D"colo=
r: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #008;"=
>last</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </sp=
an><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=
=3D"styled-by-prettify" style=3D"color: #008;">end</span><span class=3D"sty=
led-by-prettify" style=3D"color: #660;">(</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #000;">v</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #660;">);</span><span class=3D"styled-by-prettify" style=3D"=
color: #000;"><br>=C2=A0 first </span><span class=3D"styled-by-prettify" st=
yle=3D"color: #660;">!=3D</span><span class=3D"styled-by-prettify" style=3D=
"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color: #=
008;">last</span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
;</span><span class=3D"styled-by-prettify" style=3D"color: #000;"><br>=C2=
=A0 </span><span class=3D"styled-by-prettify" style=3D"color: #660;">++</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #000;">i</span><span =
class=3D"styled-by-prettify" style=3D"color: #660;">,</span><span class=3D"=
styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by=
-prettify" style=3D"color: #660;">++</span><span class=3D"styled-by-prettif=
y" style=3D"color: #000;">first</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #660;">)</span><span class=3D"styled-by-prettify" style=3D"co=
lor: #000;"><br></span><span class=3D"styled-by-prettify" style=3D"color: #=
660;">{</span><span class=3D"styled-by-prettify" style=3D"color: #000;"><br=
>=C2=A0std</span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
::</span><span class=3D"styled-by-prettify" style=3D"color: #000;">cout </s=
pan><span class=3D"styled-by-prettify" style=3D"color: #660;"><<</spa=
n><span class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span c=
lass=3D"styled-by-prettify" style=3D"color: #080;">"index: "</spa=
n><span class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span c=
lass=3D"styled-by-prettify" style=3D"color: #660;"><<</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #000;"> i </span><span class=3D"s=
tyled-by-prettify" style=3D"color: #660;"><<</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-pr=
ettify" style=3D"color: #080;">"\t"</span><span class=3D"styled-b=
y-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-prettif=
y" style=3D"color: #660;"><<</span><span class=3D"styled-by-prettify"=
style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D=
"color: #660;">*</span><span class=3D"styled-by-prettify" style=3D"color: #=
000;">first </span><span class=3D"styled-by-prettify" style=3D"color: #660;=
"><<</span><span class=3D"styled-by-prettify" style=3D"color: #000;">=
</span><span class=3D"styled-by-prettify" style=3D"color: #080;">"\n&=
quot;</span><span class=3D"styled-by-prettify" style=3D"color: #660;">;</sp=
an><span class=3D"styled-by-prettify" style=3D"color: #000;"><br></span><sp=
an class=3D"styled-by-prettify" style=3D"color: #660;">}</span></div></code=
></div><div><br></div><div>doesn't really help a whole lot. The latter =
has 80% of the ugliness of the former. We should encourage people to build =
tools that allow them to write this instead:</div><div><br></div><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"prettypri=
nt"><div class=3D"subprettyprint"><span class=3D"styled-by-prettify" style=
=3D"color: #008;">for</span><span class=3D"styled-by-prettify" style=3D"col=
or: #660;">(</span><span class=3D"styled-by-prettify" style=3D"color: #008;=
">auto</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </s=
pan><span class=3D"styled-by-prettify" style=3D"color: #660;">&[</span>=
<span class=3D"styled-by-prettify" style=3D"color: #000;">i</span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #660;">,</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;"> val</span><span class=3D"styled-by=
-prettify" style=3D"color: #660;">]</span><span class=3D"styled-by-prettify=
" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" 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"color: #660=
;">::</span><span class=3D"styled-by-prettify" style=3D"color: #000;">count=
ed_view</span><span class=3D"styled-by-prettify" style=3D"color: #660;">(</=
span><span class=3D"styled-by-prettify" style=3D"color: #000;">rng</span><s=
pan class=3D"styled-by-prettify" style=3D"color: #660;">))</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;"><br></span><span class=3D"s=
tyled-by-prettify" style=3D"color: #660;">{</span><span class=3D"styled-by-=
prettify" style=3D"color: #000;"><br>=C2=A0std</span><span class=3D"styled-=
by-prettify" style=3D"color: #660;">::</span><span class=3D"styled-by-prett=
ify" style=3D"color: #000;">cout </span><span class=3D"styled-by-prettify" =
style=3D"color: #660;"><<</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"co=
lor: #080;">"index: "</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"co=
lor: #660;"><<</span><span class=3D"styled-by-prettify" style=3D"colo=
r: #000;"> i </span><span class=3D"styled-by-prettify" style=3D"color: #660=
;"><<</span><span class=3D"styled-by-prettify" style=3D"color: #000;"=
> </span><span class=3D"styled-by-prettify" style=3D"color: #080;">"\t=
"</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </s=
pan><span class=3D"styled-by-prettify" style=3D"color: #660;"><<</spa=
n><span class=3D"styled-by-prettify" style=3D"color: #000;"> val </span><sp=
an class=3D"styled-by-prettify" style=3D"color: #660;"><<</span><span=
class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D=
"styled-by-prettify" style=3D"color: #080;">"\n"</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #660;">;</span><span class=3D"styl=
ed-by-prettify" style=3D"color: #000;"><br></span><span class=3D"styled-by-=
prettify" style=3D"color: #660;">}</span></div></code></div><div><br></div>=
<div>It's shorter. It's nearly impossible to get wrong. It makes it=
clear what's going on. Etc.</div><div><br></div><div>Most of the "=
;legitimate uses" of this feature can be rewritten in better ways. The=
few cases that can't be rewritten? Well, I can live with them.</div><d=
iv><i><br></i></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"><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><i><=
/i></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>It l=
ooks to me the disallow is just legacy "compatibility" mode - to =
let auto be optional.</div></div></blockquote><div><br></div><div>`auto` is=
optional; adding this will not make it any less optional. I don't know=
what you mean by this.</div></div></blockquote><div><br></div><div>Humm, y=
ou mean that we simply allow comma separated list to evaluate to different =
variable types?</div></div></blockquote><blockquote class=3D"gmail_quote" s=
tyle=3D"margin: 0px 0px 0px 0.8ex; padding-left: 1ex; border-left-color: rg=
b(204, 204, 204); border-left-width: 1px; border-left-style: solid;"></bloc=
kquote><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>B=
ecause otherwise, if this is added, <font face=3D"courier new,monospace">au=
to</font> is no longer optional, like it is today.</div><div><br></div><div=
><font face=3D"courier new,monospace">auto i=3D2, j=3D3; <i>//< 'aut=
o' is optional, can be replaced with int</i></font></div><div><font fac=
e=3D"courier new"><i><br></i></font></div><div><font face=3D"courier new"><=
span style=3D"display:inline!important;float:none;background-color:transpar=
ent;color:rgb(34,34,34);font-family:courier new,monospace;font-size:13px;fo=
nt-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;t=
ext-align:left;text-decoration:none;text-indent:0px;text-transform:none;whi=
te-space:normal;word-spacing:0px">auto s=3D"hi"s, i=3D1; <i>//<=
; auto is not optional, code will break if changed to anything else</i></sp=
an></font></div><div><font face=3D"courier new"><span style=3D"display:inli=
ne!important;float:none;background-color:transparent;color:rgb(34,34,34);fo=
nt-family:courier new,monospace;font-size:13px;font-style:normal;font-varia=
nt:normal;font-weight:400;letter-spacing:normal;text-align:left;text-decora=
tion:none;text-indent:0px;text-transform:none;white-space:normal;word-spaci=
ng:0px">=C2=A0</span></font></div></div></blockquote><div><br></div><div>I =
think your "optional" terminology here is confusing. It's mor=
e that it is "replaceable"; what you're talking about is the =
fact that there is some type that you can always substitute in for `auto` d=
eclarations and get the same effect.</div><div><br></div><div>Yes, this syn=
tax would remove the replicability of auto in such declarations.</div><div>=
=C2=A0</div><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"><=
div><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:none;=
text-indent:0px;letter-spacing:normal;font-size:13px;font-style:normal;font=
-variant:normal;font-weight:400;text-decoration:none;word-spacing:0px;displ=
ay:inline!important;white-space:normal;float:none;background-color:transpar=
ent"><font face=3D"arial,sans-serif">I really doubt anyone will have a prob=
lem with the fact auto is not optional, though.</font></span><br></div></di=
v></blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/7bb5e8c0-dcd4-42ff-a431-d11f3690d6b2%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/7bb5e8c0-dcd4-42ff-a431-d11f3690d6b2=
%40isocpp.org</a>.<br />
------=_Part_12094_449636315.1515346746995--
------=_Part_12093_1834222699.1515346746994--
.
Author: mihailnajdenov@gmail.com
Date: Sun, 7 Jan 2018 09:40:44 -0800 (PST)
Raw View
------=_Part_2788_1978844842.1515346844977
Content-Type: multipart/alternative;
boundary="----=_Part_2789_1906318858.1515346844978"
------=_Part_2789_1906318858.1515346844978
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 6:19:21 PM UTC+2, Patrice Roy wrote:
>
> ...
>
> If you see single-auto, multiple types as the way to go, I think it's a
> position that deserves a paper. It does not jump as being to path to follow
> in a self-evident manner; maybe you'll find a convincing angle, and I for
> one will happily read it once it's written. The alternatives seem less
> contentious to me, given prior art, but I'm open to examining what you have
> in mind once it's been put in proposal form.
>
>
Prior art here is actually C and predates the new funky stuff (which has it
own place).
It is worth noting we already *can* declare variables of different types:
int i, *pi;
these two are *radically* different types.
And it gets "better"
int i, *p, a[12], f(), (*pf)(double), C::*mf;
It is painfully obvious here, it is allowed to be declared *anything* on a
single line *as long as* it can be *parsed* from that initial int. However
int-parseble here have no semantic meaning, it simply a syntax limitation,
nothing more.
C++ can improve that, to fix the age old (technical) limitation,
*preserving* prior art, because the original intent did not forbid multiple
types, just had no way to express them completely. We can,
--
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/12ea95dd-0390-47ca-8245-b5c68f5848a1%40isocpp.org.
------=_Part_2789_1906318858.1515346844978
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br style=3D"background-attachment: scroll; background-cli=
p: border-box; background-color: transparent; background-image: none; backg=
round-origin: padding-box; background-position-x: 0%; background-position-y=
: 0%; background-repeat: repeat; background-size: auto; border-bottom-color=
: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bor=
der-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%=
; border-image-source: none; border-image-width: 1; border-left-color: rgb(=
34, 34, 34); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width=
: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&=
quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal; f=
ont-variant: normal; font-weight: 400; height: auto; letter-spacing: normal=
; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;=
min-width: 0px; orphans: 2; overflow: visible; overflow-x: visible; overfl=
ow-y: visible; padding-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: normal=
; word-spacing: 0px;"><span style=3D"background-color: transparent; border-=
bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wid=
th: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(34, 34, 34); border-right-style: none; border-right-=
width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bord=
er-top-width: 0px; color: rgb(34, 34, 34); display: inline; float: none; fo=
nt-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-ser=
if; 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-top: 0px; orphans: 2; padding-bottom: 0px; padding-left:=
0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decorati=
on: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width=
: 0px; white-space: normal; word-spacing: 0px;">On Sunday, January 7, 2018 =
at 6:19:21 PM UTC+2, Patrice Roy wrote:</span><blockquote class=3D"gmail_qu=
ote" style=3D"background-color: transparent; border-left-color: rgb(204, 20=
4, 204); border-left-style: solid; border-left-width: 1px; color: rgb(34, 3=
4, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot=
;,sans-serif; font-size: 13px; font-style: normal; font-variant: normal; fo=
nt-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 5.=
38px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-left: 6.73px;=
text-align: left; text-decoration: none; text-indent: 0px; text-transform:=
none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0=
px;"><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none;=
border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-=
style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bo=
rder-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;" dir=3D"ltr"><div style=3D"b=
order-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bott=
om-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border=
-image-slice: 100%; border-image-source: none; border-image-width: 1; borde=
r-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-=
right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none=
; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right=
: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-rig=
ht: 0px; padding-top: 0px;"><div style=3D"border-bottom-color: rgb(34, 34, =
34); border-bottom-style: none; border-bottom-width: 0px; border-image-outs=
et: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image=
-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); b=
order-left-style: none; border-left-width: 0px; border-right-color: rgb(34,=
34, 34); border-right-style: none; border-right-width: 0px; border-top-col=
or: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-=
bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-=
bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><div=
style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; =
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stre=
tch; border-image-slice: 100%; border-image-source: none; border-image-widt=
h: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-=
style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;"><div style=3D"border-bottom-color: r=
gb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(34,=
34, 34); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0=
px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top:=
0px;">...<br style=3D"background-attachment: scroll; background-clip: bord=
er-box; background-color: transparent; background-image: none; background-o=
rigin: padding-box; background-position-x: 0%; background-position-y: 0%; b=
ackground-repeat: repeat; background-size: auto; border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
color: rgb(34, 34, 34); font-size: 13px; height: auto; margin-bottom: 0px; =
margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overf=
low: visible; overflow-x: visible; overflow-y: visible; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div></div></d=
iv><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style:=
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repea=
t: stretch; border-image-slice: 100%; border-image-source: none; border-ima=
ge-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; b=
order-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-st=
yle: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bord=
er-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left:=
0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left=
: 0px; padding-right: 0px; padding-top: 0px;"><br style=3D"background-attac=
hment: scroll; background-clip: border-box; background-color: transparent; =
background-image: none; background-origin: padding-box; background-position=
-x: 0%; background-position-y: 0%; background-repeat: repeat; background-si=
ze: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; =
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stre=
tch; border-image-slice: 100%; border-image-source: none; border-image-widt=
h: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-=
style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-size: 13px=
; height: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; ma=
rgin-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible; over=
flow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;"></div></div>If you see single-auto, multiple types as =
the way to go, I think it's a position that deserves a paper. It does n=
ot jump as being to path to follow in a self-evident manner; maybe you'=
ll find a convincing angle, and I for one will happily read it once it'=
s written. The alternatives seem less contentious to me, given prior art, b=
ut I'm open to examining what you have in mind once it's been put i=
n proposal form.<br style=3D"background-attachment: scroll; background-clip=
: border-box; background-color: transparent; background-image: none; backgr=
ound-origin: padding-box; background-position-x: 0%; background-position-y:=
0%; background-repeat: repeat; background-size: auto; border-bottom-color:=
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bord=
er-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%;=
border-image-source: none; border-image-width: 1; border-left-color: rgb(3=
4, 34, 34); border-left-style: none; border-left-width: 0px; border-right-c=
olor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width:=
0px; color: rgb(34, 34, 34); font-size: 13px; height: auto; margin-bottom:=
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px;=
overflow: visible; overflow-x: visible; overflow-y: visible; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br style=
=3D"background-attachment: scroll; background-clip: border-box; background-=
color: transparent; background-image: none; background-origin: padding-box;=
background-position-x: 0%; background-position-y: 0%; background-repeat: r=
epeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, =
34); font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overf=
low-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px=
; padding-right: 0px; padding-top: 0px;"></div></blockquote><div style=3D"b=
ackground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: 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; 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: normal; word-spacing: 0px;"><br style=3D"border-=
bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wid=
th: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(34, 34, 34); border-right-style: none; border-right-=
width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bord=
er-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px;"></div><div style=3D"background-color: transparent; bo=
rder-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-botto=
m-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(34, 34, 34); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none;=
border-top-width: 0px; color: rgb(34, 34, 34); font-family: &quot;Aria=
l&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font=
-style: normal; font-variant: normal; font-weight: 400; letter-spacing: nor=
mal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0=
px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px;=
padding-top: 0px; text-align: left; text-decoration: none; text-indent: 0p=
x; text-transform: none; -webkit-text-stroke-width: 0px; white-space: norma=
l; word-spacing: 0px;">Prior art here is actually C and predates the new fu=
nky stuff (which has it own place).</div><div style=3D"background-color: tr=
ansparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none;=
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-=
left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: n=
one; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top=
-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &=
amp;quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-siz=
e: 13px; font-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; paddin=
g-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; te=
xt-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white=
-space: normal; word-spacing: 0px;"><br style=3D"border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;"></div><div style=3D"background-color: transparent; border-bottom-color: =
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(34=
, 34, 34); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: =
0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&qu=
ot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal; fon=
t-variant: normal; font-weight: 400; letter-spacing: normal; margin-bottom:=
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; pad=
ding-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: normal; word-spacing: 0p=
x;">It is worth noting we already <i style=3D"background-attachment: scroll=
; background-clip: border-box; background-color: transparent; background-im=
age: none; background-origin: padding-box; background-position-x: 0%; backg=
round-position-y: 0%; background-repeat: repeat; background-size: auto; bor=
der-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(34, 34, 34); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; =
border-top-width: 0px; color: rgb(34, 34, 34); font-size: 13px; height: aut=
o; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; min-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visib=
le; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top=
: 0px;">can</i> declare variables of different types:</div><div style=3D"ba=
ckground-color: transparent; border-bottom-color: rgb(34, 34, 34); border-b=
ottom-style: none; 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(34, 34, 34); border-left-st=
yle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bor=
der-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 3=
4, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 3=
4); 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; margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-de=
coration: none; text-indent: 0px; text-transform: none; -webkit-text-stroke=
-width: 0px; white-space: normal; word-spacing: 0px;"><br style=3D"border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;"></div><div style=3D"background-color: transparent; bor=
der-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(34, 34, 34); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; =
border-top-width: 0px; 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: norm=
al; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; 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; -webkit-text-stroke-width: 0px; white-space: normal=
; word-spacing: 0px;"><font face=3D"courier new,monospace" style=3D"border-=
bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wid=
th: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(34, 34, 34); border-right-style: none; border-right-=
width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bord=
er-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px;">int i, *pi;</font></div><div style=3D"background-colo=
r: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-fami=
ly: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; fon=
t-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; l=
etter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px; text-align: left; text-decoration: non=
e; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; =
white-space: normal; word-spacing: 0px;"><font face=3D"courier new" style=
=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(34, =
34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34=
); border-left-style: none; border-left-width: 0px; border-right-color: rgb=
(34, 34, 34); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; mar=
gin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padd=
ing-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=
</font></div><div style=3D"background-color: transparent; border-bottom-col=
or: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; b=
order-image-outset: 0; border-image-repeat: stretch; border-image-slice: 10=
0%; border-image-source: none; border-image-width: 1; border-left-color: rg=
b(34, 34, 34); border-left-style: none; border-left-width: 0px; border-righ=
t-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px=
; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wid=
th: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&am=
p;quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal;=
font-variant: normal; font-weight: 400; letter-spacing: normal; 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: normal; word-spacing=
: 0px;"><font face=3D"arial,sans-serif" style=3D"border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;">these two are <i style=3D"background-attachment: scroll; background-clip=
: border-box; background-color: transparent; background-image: none; backgr=
ound-origin: padding-box; background-position-x: 0%; background-position-y:=
0%; background-repeat: repeat; background-size: auto; border-bottom-color:=
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bord=
er-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%;=
border-image-source: none; border-image-width: 1; border-left-color: rgb(3=
4, 34, 34); border-left-style: none; border-left-width: 0px; border-right-c=
olor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width:=
0px; color: rgb(34, 34, 34); font-family: arial,sans-serif; font-size: 13p=
x; height: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; m=
argin-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible; ove=
rflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px;">radically</i> different types.</font></div><div style=
=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; 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(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34,=
34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&qu=
ot;,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-top: 0px; orphans: 2; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; t=
ext-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-=
stroke-width: 0px; white-space: normal; word-spacing: 0px;"><br style=3D"bo=
rder-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-botto=
m-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(34, 34, 34); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none;=
border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right:=
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;"></div><div style=3D"background-color: transparen=
t; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-=
bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bo=
rder-image-slice: 100%; border-image-source: none; border-image-width: 1; b=
order-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wid=
th: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bor=
der-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: =
none; border-top-width: 0px; 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; 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;">And it gets "better"</div><div style=
=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; 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(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34,=
34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&qu=
ot;,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-top: 0px; orphans: 2; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; t=
ext-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-=
stroke-width: 0px; white-space: normal; word-spacing: 0px;"><font face=3D"c=
ourier new" style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px;"><br style=3D"border-botto=
m-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0=
px; border-image-outset: 0; border-image-repeat: stretch; border-image-slic=
e: 100%; border-image-source: none; border-image-width: 1; border-left-colo=
r: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(34, 34, 34); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-to=
p-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; marg=
in-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pa=
dding-top: 0px;"></font></div><div style=3D"background-color: transparent; =
border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bot=
tom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; borde=
r-image-slice: 100%; border-image-source: none; border-image-width: 1; bord=
er-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width:=
0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: non=
e; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &quot;Ar=
ial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; fo=
nt-style: normal; font-variant: normal; font-weight: 400; letter-spacing: n=
ormal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px; text-align: left; text-decoration: none; text-indent: =
0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: nor=
mal; word-spacing: 0px;"><font face=3D"courier new" style=3D"border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; 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(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;">int i, *p, <span style=3D"background-color: transparent; bor=
der-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(34, 34, 34); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; =
border-top-width: 0px; color: rgb(34, 34, 34); display: inline; float: none=
; font-family: courier new; font-size: 13px; font-style: normal; font-varia=
nt: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bo=
ttom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-al=
ign: left; text-decoration: none; text-indent: 0px; text-transform: none; -=
webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">a[1=
2], </span>f(), (*pf)(double), C::*mf;</font></div><div style=3D"background=
-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; 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: 4=
00; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0=
px; 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: normal; word-spacing: 0px;"><font face=3D"courier new" st=
yle=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bor=
der-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(34, 34, 34); border-left-style: none; border-left=
-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none;=
border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-sty=
le: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;"></font></div><div style=3D"background-color: transparent; border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; 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(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,=
&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: norm=
al; 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: 0px; padding-top=
: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-tran=
sform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spac=
ing: 0px;"><br></div><div style=3D"background-color: transparent; border-bo=
ttom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border=
-top-width: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&q=
uot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style:=
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orp=
hans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; text=
-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; word=
-spacing: 0px;">It is painfully obvious here, it is allowed to be declared =
<i style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none=
; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: st=
retch; border-image-slice: 100%; border-image-source: none; border-image-wi=
dth: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border=
-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: =
none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-to=
p-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px;=
margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px=
; padding-right: 0px; padding-top: 0px;">anything</i> on a single line <i>a=
s long as</i> it can be <i style=3D"border-bottom-color: rgb(34, 34, 34); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 3=
4); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom=
: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">parsed</i>=
from that initial int. However int-parseble here have no semantic meaning,=
it simply a syntax limitation, nothing more.</div><div style=3D"background=
-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; 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: 4=
00; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0=
px; 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: normal; word-spacing: 0px;"><br></div><div style=3D"backg=
round-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bott=
om-style: none; border-bottom-width: 0px; border-image-outset: 0; border-im=
age-repeat: stretch; border-image-slice: 100%; border-image-source: none; b=
order-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, =
34); border-top-style: none; border-top-width: 0px; 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-weig=
ht: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decor=
ation: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wi=
dth: 0px; white-space: normal; word-spacing: 0px;">C++ can improve that, to=
fix the age old (technical) limitation, <b>preserving</b> prior art, becau=
se the original intent did not forbid multiple types, just had no way to ex=
press them completely. We can,</div><div style=3D"background-color: transpa=
rent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bord=
er-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(34, 34, 34); border-left-style: none; border-left-=
width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; =
border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-styl=
e: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &q=
uot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13=
px; font-style: normal; font-variant: normal; font-weight: 400; letter-spac=
ing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margi=
n-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-rig=
ht: 0px; padding-top: 0px; text-align: left; text-decoration: none; text-in=
dent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-spac=
e: normal; word-spacing: 0px;"><br></div><div style=3D"background-color: tr=
ansparent; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none;=
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: str=
etch; border-image-slice: 100%; border-image-source: none; border-image-wid=
th: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-=
left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: n=
one; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top=
-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &=
amp;quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-siz=
e: 13px; font-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; paddin=
g-right: 0px; padding-top: 0px; text-align: left; text-decoration: none; te=
xt-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white=
-space: normal; word-spacing: 0px;"><font face=3D"courier new" style=3D"bor=
der-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(34, 34, 34); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; =
border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right=
: 0px; padding-top: 0px;"><i style=3D"border-bottom-color: rgb(34, 34, 34);=
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: =
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-sou=
rce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); borde=
r-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34,=
34); border-right-style: none; border-right-width: 0px; border-top-color: =
rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bott=
om: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bott=
om: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></i><i s=
tyle=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; bo=
rder-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretc=
h; border-image-slice: 100%; border-image-source: none; border-image-width:=
1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-lef=
t-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none=
; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-st=
yle: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pa=
dding-right: 0px; padding-top: 0px;"></i><i style=3D"border-bottom-color: r=
gb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(34,=
34, 34); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0=
px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top:=
0px;"></i><i style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-=
style: none; border-bottom-width: 0px; border-image-outset: 0; border-image=
-repeat: stretch; border-image-slice: 100%; border-image-source: none; bord=
er-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: n=
one; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-ri=
ght-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34)=
; border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin=
-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddin=
g-left: 0px; padding-right: 0px; padding-top: 0px;"></i><br style=3D"border=
-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wi=
dth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-imag=
e-slice: 100%; border-image-source: none; border-image-width: 1; border-lef=
t-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(34, 34, 34); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bor=
der-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px=
; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0=
px; padding-top: 0px;"></font></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/12ea95dd-0390-47ca-8245-b5c68f5848a1%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/12ea95dd-0390-47ca-8245-b5c68f5848a1=
%40isocpp.org</a>.<br />
------=_Part_2789_1906318858.1515346844978--
------=_Part_2788_1978844842.1515346844977--
.
Author: mihailnajdenov@gmail.com
Date: Sun, 7 Jan 2018 09:50:35 -0800 (PST)
Raw View
------=_Part_12022_801619728.1515347435420
Content-Type: multipart/alternative;
boundary="----=_Part_12023_1629978574.1515347435421"
------=_Part_12023_1629978574.1515347435421
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 7:40:45 PM UTC+2, mihailn...@gmail.com wrote:
>
>
> On Sunday, January 7, 2018 at 6:19:21 PM UTC+2, Patrice Roy wrote:
>>
>> ...
>>
>> If you see single-auto, multiple types as the way to go, I think it's a
>> position that deserves a paper. It does not jump as being to path to follow
>> in a self-evident manner; maybe you'll find a convincing angle, and I for
>> one will happily read it once it's written. The alternatives seem less
>> contentious to me, given prior art, but I'm open to examining what you have
>> in mind once it's been put in proposal form.
>>
>>
> Prior art here is actually C and predates the new funky stuff (which has
> it own place).
>
> It is worth noting we already *can* declare variables of different types:
>
> int i, *pi;
>
> these two are *radically* different types.
>
> And it gets "better"
>
> int i, *p, a[12], f(), (*pf)(double), C::*mf;
>
>
> It is painfully obvious here, it is allowed to be declared *anything* on
> a single line *as long as* it can be
>
....parsed from int. However int-parsable have no semantic meaning. C++ can
improve that, fix the age old (technical) limitation, as it was never
semantically unwise or forbidden to have multiple variables of different
types declared on one line, we just didn't have the tools to express that
completely, only partially.
--
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/b056c888-3217-4d58-8fe2-38b62b0b147b%40isocpp.org.
------=_Part_12023_1629978574.1515347435421
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, January 7, 2018 at 7:40:45 PM UTC+2, mi=
hailn...@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><span>On Sunday, January 7, 2018 at 6:19:21 PM UTC+2, Patri=
ce Roy wrote:</span><blockquote class=3D"gmail_quote"><div style=3D"border-=
bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wi=
dth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wid=
th:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px" dir=3D=
"ltr"><div style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:n=
one;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-sty=
le:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right=
-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-to=
p-style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-=
right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:=
0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(34,34,34);border=
-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);=
border-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,3=
4);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,3=
4,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-l=
eft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px=
;padding-right:0px;padding-top:0px"><div style=3D"border-bottom-color:rgb(3=
4,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px"><div style=3D"border-bot=
tom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;bo=
rder-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;=
border-right-color:rgb(34,34,34);border-right-style:none;border-right-width=
:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:=
0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;paddi=
ng-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">...<br st=
yle=3D"background-color:transparent;background-image:none;background-repeat=
:repeat;border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-b=
ottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;bord=
er-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;=
border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none=
;border-top-width:0px;color:rgb(34,34,34);font-size:13px;min-height:auto;ma=
rgin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;min-width:0=
px;overflow:visible;overflow-x:visible;overflow-y:visible;padding-bottom:0p=
x;padding-left:0px;padding-right:0px;padding-top:0px"></div></div></div><di=
v style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;borde=
r-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;b=
order-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:no=
ne;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:n=
one;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px=
;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;paddi=
ng-top:0px"><br style=3D"background-color:transparent;background-image:none=
;background-repeat:repeat;border-bottom-color:rgb(34,34,34);border-bottom-s=
tyle:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-le=
ft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);border=
-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bor=
der-top-style:none;border-top-width:0px;color:rgb(34,34,34);font-size:13px;=
min-height:auto;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-t=
op:0px;min-width:0px;overflow:visible;overflow-x:visible;overflow-y:visible=
;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></d=
iv></div>If you see single-auto, multiple types as the way to go, I think i=
t's a position that deserves a paper. It does not jump as being to path=
to follow in a self-evident manner; maybe you'll find a convincing ang=
le, and I for one will happily read it once it's written. The alternati=
ves seem less contentious to me, given prior art, but I'm open to exami=
ning what you have in mind once it's been put in proposal form.<br styl=
e=3D"background-color:transparent;background-image:none;background-repeat:r=
epeat;border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bot=
tom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border=
-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bo=
rder-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;b=
order-top-width:0px;color:rgb(34,34,34);font-size:13px;min-height:auto;marg=
in-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;min-width:0px=
;overflow:visible;overflow-x:visible;overflow-y:visible;padding-bottom:0px;=
padding-left:0px;padding-right:0px;padding-top:0px"><br style=3D"background=
-color:transparent;background-image:none;background-repeat:repeat;border-bo=
ttom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;b=
order-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px=
;border-right-color:rgb(34,34,34);border-right-style:none;border-right-widt=
h:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width=
:0px;color:rgb(34,34,34);font-size:13px;min-height:auto;margin-bottom:0px;m=
argin-left:0px;margin-right:0px;margin-top:0px;min-width:0px;overflow:visib=
le;overflow-x:visible;overflow-y:visible;padding-bottom:0px;padding-left:0p=
x;padding-right:0px;padding-top:0px"></div></blockquote><div><br style=3D"b=
order-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-wid=
th:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-left-w=
idth:0px;border-right-color:rgb(34,34,34);border-right-style:none;border-ri=
ght-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-t=
op-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:=
0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">=
</div><div>Prior art here is actually C and predates the new funky stuff (w=
hich has it own place).</div><div><br style=3D"border-bottom-color:rgb(34,3=
4,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:rg=
b(34,34,34);border-left-style:none;border-left-width:0px;border-right-color=
:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-co=
lor:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:=
0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padd=
ing-left:0px;padding-right:0px;padding-top:0px"></div><div>It is worth noti=
ng we already <i style=3D"background-color:transparent;background-image:non=
e;background-repeat:repeat;border-bottom-color:rgb(34,34,34);border-bottom-=
style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-l=
eft-style:none;border-left-width:0px;border-right-color:rgb(34,34,34);borde=
r-right-style:none;border-right-width:0px;border-top-color:rgb(34,34,34);bo=
rder-top-style:none;border-top-width:0px;color:rgb(34,34,34);font-size:13px=
;min-height:auto;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-=
top:0px;min-width:0px;overflow:visible;overflow-x:visible;overflow-y:visibl=
e;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">ca=
n</i> declare variables of different types:</div><div><br style=3D"border-b=
ottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;=
border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0p=
x;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wid=
th:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-widt=
h:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"></div><=
div><font face=3D"courier new,monospace" style=3D"border-bottom-color:rgb(3=
4,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color=
:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-right-co=
lor:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top=
-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bott=
om:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;p=
adding-left:0px;padding-right:0px;padding-top:0px">int i, *pi;</font></div>=
<div><font face=3D"courier new" style=3D"border-bottom-color:rgb(34,34,34);=
border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,3=
4,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(3=
4,34,34);border-right-style:none;border-right-width:0px;border-top-color:rg=
b(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;ma=
rgin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-le=
ft:0px;padding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:=
rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-=
color:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-rig=
ht-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;borde=
r-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin=
-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:=
0px;padding-left:0px;padding-right:0px;padding-top:0px"></font></div><div><=
font face=3D"arial,sans-serif" style=3D"border-bottom-color:rgb(34,34,34);b=
order-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34=
,34);border-left-style:none;border-left-width:0px;border-right-color:rgb(34=
,34,34);border-right-style:none;border-right-width:0px;border-top-color:rgb=
(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;mar=
gin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-lef=
t:0px;padding-right:0px;padding-top:0px">these two are <i style=3D"backgrou=
nd-color:transparent;background-image:none;background-repeat:repeat;border-=
bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wi=
dth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wid=
th:0px;color:rgb(34,34,34);font-family:arial,sans-serif;font-size:13px;min-=
height:auto;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0=
px;min-width:0px;overflow:visible;overflow-x:visible;overflow-y:visible;pad=
ding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">radical=
ly</i> different types.</font></div><div><br style=3D"border-bottom-color:r=
gb(34,34,34);border-bottom-style:none;border-bottom-width:0px;border-left-c=
olor:rgb(34,34,34);border-left-style:none;border-left-width:0px;border-righ=
t-color:rgb(34,34,34);border-right-style:none;border-right-width:0px;border=
-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px"></div><div>And it ge=
ts "better"</div><div><font face=3D"courier new" style=3D"border-=
bottom-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px=
;border-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0=
px;border-right-color:rgb(34,34,34);border-right-style:none;border-right-wi=
dth:0px;border-top-color:rgb(34,34,34);border-top-style:none;border-top-wid=
th:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;pa=
dding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px"><br st=
yle=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-bo=
ttom-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;borde=
r-left-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;b=
order-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;=
border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;mar=
gin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-t=
op:0px"></font></div><div><font face=3D"courier new" style=3D"border-bottom=
-color:rgb(34,34,34);border-bottom-style:none;border-bottom-width:0px;borde=
r-left-color:rgb(34,34,34);border-left-style:none;border-left-width:0px;bor=
der-right-color:rgb(34,34,34);border-right-style:none;border-right-width:0p=
x;border-top-color:rgb(34,34,34);border-top-style:none;border-top-width:0px=
;margin-bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-=
bottom:0px;padding-left:0px;padding-right:0px;padding-top:0px">int i, *p, <=
span style=3D"background-color:transparent;border-bottom-color:rgb(34,34,34=
);border-bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34=
,34,34);border-left-style:none;border-left-width:0px;border-right-color:rgb=
(34,34,34);border-right-style:none;border-right-width:0px;border-top-color:=
rgb(34,34,34);border-top-style:none;border-top-width:0px;color:rgb(34,34,34=
);display:inline;float:none;font-family:courier new;font-size:13px;font-sty=
le:normal;font-variant:normal;font-weight:400;letter-spacing:normal;margin-=
bottom:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0=
px;padding-left:0px;padding-right:0px;padding-top:0px;text-align:left;text-=
decoration:none;text-indent:0px;text-transform:none;white-space:normal;word=
-spacing:0px">a[12], </span>f(), (*pf)(double), C::*mf;</font></div><div><f=
ont face=3D"courier new" style=3D"border-bottom-color:rgb(34,34,34);border-=
bottom-style:none;border-bottom-width:0px;border-left-color:rgb(34,34,34);b=
order-left-style:none;border-left-width:0px;border-right-color:rgb(34,34,34=
);border-right-style:none;border-right-width:0px;border-top-color:rgb(34,34=
,34);border-top-style:none;border-top-width:0px;margin-bottom:0px;margin-le=
ft:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;=
padding-right:0px;padding-top:0px"><br style=3D"border-bottom-color:rgb(34,=
34,34);border-bottom-style:none;border-bottom-width:0px;border-left-color:r=
gb(34,34,34);border-left-style:none;border-left-width:0px;border-right-colo=
r:rgb(34,34,34);border-right-style:none;border-right-width:0px;border-top-c=
olor:rgb(34,34,34);border-top-style:none;border-top-width:0px;margin-bottom=
:0px;margin-left:0px;margin-right:0px;margin-top:0px;padding-bottom:0px;pad=
ding-left:0px;padding-right:0px;padding-top:0px"></font></div><div><br></di=
v><div>It is painfully obvious here, it is allowed to be declared <i style=
=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:none;border-botto=
m-width:0px;border-left-color:rgb(34,34,34);border-left-style:none;border-l=
eft-width:0px;border-right-color:rgb(34,34,34);border-right-style:none;bord=
er-right-width:0px;border-top-color:rgb(34,34,34);border-top-style:none;bor=
der-top-width:0px;margin-bottom:0px;margin-left:0px;margin-right:0px;margin=
-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0px;padding-top:=
0px">anything</i> on a single line <i>as long as</i> it can be</div></div><=
/blockquote><div><br></div><div>...parsed from int. However int-parsable ha=
ve no semantic meaning. C++ can improve that, fix the age old (technical) l=
imitation, as it was never semantically unwise or forbidden to have multipl=
e variables of different types declared on one line, we just didn't hav=
e the tools to express that completely, only partially.=C2=A0</div><div><br=
></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/b056c888-3217-4d58-8fe2-38b62b0b147b%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/b056c888-3217-4d58-8fe2-38b62b0b147b=
%40isocpp.org</a>.<br />
------=_Part_12023_1629978574.1515347435421--
------=_Part_12022_801619728.1515347435420--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Sun, 7 Jan 2018 17:51:36 +0000
Raw View
--001a113d2b7843d18a0562335525
Content-Type: text/plain; charset="UTF-8"
On 7 Jan 2018 17:40, <mihailnajdenov@gmail.com> wrote:
int i, *p, a[12], f(), (*pf)(double), C::*mf;
This reply should have been accompanied by a health warning!
Seriously, though, it's a great example. I honestly hope I never see it in
the wild, but it serves a good purpose.
--
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/CAC%2B0CCNgDCqHtWsjtVwjzOQD2OEjG7qCsaM_kkKtA%2B2bdEbjbw%40mail.gmail.com.
--001a113d2b7843d18a0562335525
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto">On 7 Jan 2018 17:40, <<a href=3D"mailto:mihailnajdeno=
v@gmail.com">mihailnajdenov@gmail.com</a>> wrote:<div class=3D"gmail_ext=
ra" dir=3D"auto"><div class=3D"gmail_quote"><blockquote class=3D"quote" sty=
le=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div d=
ir=3D"ltr"><div><span style=3D"font-family:"courier new"">int i, =
*p, </span><span style=3D"font-family:"courier new";border-color:=
rgb(34,34,34);border-style:none;border-width:0px;color:rgb(34,34,34);font-s=
ize:13px;font-variant-numeric:normal;font-variant-east-asian:normal;margin:=
0px;padding:0px">a[12], </span><span style=3D"font-family:"courier new=
"">f(), (*pf)(double), C::*mf;</span><br></div><div><font face=3D"cour=
ier new" style=3D"border-bottom-color:rgb(34,34,34);border-bottom-style:non=
e;border-bottom-width:0px;border-left-color:rgb(34,34,34);border-left-style=
:none;border-left-width:0px;border-right-color:rgb(34,34,34);border-right-s=
tyle:none;border-right-width:0px;border-top-color:rgb(34,34,34);border-top-=
style:none;border-top-width:0px;margin-bottom:0px;margin-left:0px;margin-ri=
ght:0px;margin-top:0px;padding-bottom:0px;padding-left:0px;padding-right:0p=
x;padding-top:0px"></font></div></div></blockquote></div></div><div dir=3D"=
auto"><br></div><div dir=3D"auto">This reply should have been accompanied b=
y a health warning!</div><div dir=3D"auto"><br></div><div dir=3D"auto">Seri=
ously, though, it's a great example. I honestly hope I never see it in =
the wild, but it serves a good purpose.</div><div dir=3D"auto"><br></div><d=
iv dir=3D"auto"><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCNgDCqHtWsjtVwjzOQD2OEjG7qCsa=
M_kkKtA%2B2bdEbjbw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCNgDC=
qHtWsjtVwjzOQD2OEjG7qCsaM_kkKtA%2B2bdEbjbw%40mail.gmail.com</a>.<br />
--001a113d2b7843d18a0562335525--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sun, 7 Jan 2018 15:24:22 -0500
Raw View
--94eb2c0550d6a176c805623577bb
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
I might have been imprecise;
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0691r0.pdf in
section "Abbreviated function syntax support for both =E2=80=9Csame=E2=80=
=9D and =E2=80=9Cseparate"
discussed the case of f(C a,C b) for some concept C and the fact that not
everyone agreed as to whether a and b had to be the same type or could be
two distinct types as long as both respected concept C. Should it be
decided that a and b would need to be of the same type, the discrepancy
with f(auto a, auto b) behavior was given as an example. I'm not sure there
exists a paper defending a position such that f(auto a, auto b) would ask
of a and b to be of the same type; and that was not what I had in mind when
writing that short statement. Thanks for the opportunity to make this
clearer.
2018-01-07 12:19 GMT-05:00 Ville Voutilainen <ville.voutilainen@gmail.com>:
> On 7 January 2018 at 18:19, Patrice Roy <patricer@gmail.com> wrote:
> > template <Regular T> void f(T, T); // same type
> > void g(Regular, Regular); // if short syntax eventually gets in : same
> type?
> > different types?
> > void h(auto a, auto b); // same rules as Regular,Regular or not? Papers
> have
> > been written debating both options
>
> I haven't seen a paper suggesting that h should have two parameters of
> the same type,
> can you point me to one?
>
> --
> 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/CAFk2RUYp9mEboC9KM_
> RG4xhKZ5VESw7dxqLYf-PnMT4_P8-K-g%40mail.gmail.com.
>
--=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/CAKiZDp0XV7%3DnF_%2BG9-xTzpjxJQOgUREZ6%2BBA1_Uxr=
w3L4325Qw%40mail.gmail.com.
--94eb2c0550d6a176c805623577bb
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">I might have been imprecise; <a href=3D"http://www.open-st=
d.org/jtc1/sc22/wg21/docs/papers/2017/p0691r0.pdf">http://www.open-std.org/=
jtc1/sc22/wg21/docs/papers/2017/p0691r0.pdf</a> in section "Abbreviate=
d function syntax support for both =E2=80=9Csame=E2=80=9D and =E2=80=9Csepa=
rate" discussed the case of f(C a,C b) for some concept C and the fact=
that not everyone agreed as to whether a and b had to be the same type or =
could be two distinct types as long as both respected concept C. Should it =
be decided that a and b would need to be of the same type, the discrepancy =
with f(auto a, auto b) behavior was given as an example. I'm not sure t=
here exists a paper defending a position such that f(auto a, auto b) would =
ask of a and b to be of the same type; and that was not what I had in mind =
when writing that short statement. Thanks for the opportunity to make this =
clearer.<br></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote"=
>2018-01-07 12:19 GMT-05:00 Ville Voutilainen <span dir=3D"ltr"><<a href=
=3D"mailto:ville.voutilainen@gmail.com" target=3D"_blank">ville.voutilainen=
@gmail.com</a>></span>:<br><blockquote class=3D"gmail_quote" style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=3D=
"">On 7 January 2018 at 18:19, Patrice Roy <<a href=3D"mailto:patricer@g=
mail.com">patricer@gmail.com</a>> wrote:<br>
> template <Regular T> void f(T, T); // same type<br>
> void g(Regular, Regular); // if short syntax eventually gets in : same=
type?<br>
> different types?<br>
> void h(auto a, auto b); // same rules as Regular,Regular or not? Paper=
s have<br>
> been written debating both options<br>
<br>
</span>I haven't seen a paper suggesting that h should have two paramet=
ers of<br>
the same type,<br>
can you point me to one?<br>
<span class=3D""><br>
--<br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org">std-propo=
sals+unsubscribe@<wbr>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>
</span>To view this discussion on the web visit <a href=3D"https://groups.g=
oogle.com/a/isocpp.org/d/msgid/std-proposals/CAFk2RUYp9mEboC9KM_RG4xhKZ5VES=
w7dxqLYf-PnMT4_P8-K-g%40mail.gmail.com" rel=3D"noreferrer" target=3D"_blank=
">https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/CA=
Fk2RUYp9mEboC9KM_<wbr>RG4xhKZ5VESw7dxqLYf-PnMT4_P8-<wbr>K-g%40mail.gmail.co=
m</a>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp0XV7%3DnF_%2BG9-xTzpjxJQOgUREZ=
6%2BBA1_Uxrw3L4325Qw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp0XV7=
%3DnF_%2BG9-xTzpjxJQOgUREZ6%2BBA1_Uxrw3L4325Qw%40mail.gmail.com</a>.<br />
--94eb2c0550d6a176c805623577bb--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sun, 7 Jan 2018 15:27:15 -0500
Raw View
--f403045e765cf4634e056235812f
Content-Type: text/plain; charset="UTF-8"
With respect to "what prior art", I had the lambda capture syntax and the
structured binding syntax, both of which strongly resemble the original
proposition in this thread. I understand the interest for the multiple
types, single auto declaration, but I don't see an existing case such as
this one currently.
The example provided by Jake with an implicit cast does not affect the
object's type and as such, does not seem like an existing case to me.
2018-01-07 12:23 GMT-05:00 Nicol Bolas <jmckesson@gmail.com>:
> On Sunday, January 7, 2018 at 11:19:21 AM UTC-5, Patrice Roy wrote:
>>
>> I don't think it's a matter of sentence length in the standard text. It's
>> more a matter of :
>>
>> int a = 2, b = 3; // same type
>> auto x = "hello"s, y = 3.14159; // distinct types, quite new; impact on
>> the way people write C++? Requires thought, at the very least
>> // ...
>> template <Regular T> void f(T, T); // same type
>> void g(Regular, Regular); // if short syntax eventually gets in : same
>> type? different types?
>> void h(auto a, auto b); // same rules as Regular,Regular or not? Papers
>> have been written debating both options
>>
>> If you see single-auto, multiple types as the way to go, I think it's a
>> position that deserves a paper. It does not jump as being to path to follow
>> in a self-evident manner;
>>
>
> Why not?
>
> Why is this "self-evident":
>
> auto [i = std::size_t(0), first = begin(v), last = end(v)];
>
> When this is not "self-evident":
>
> auto i = std::size_t(0), first = begin(v), last = end(v);
>
> Literally the only difference between them is the presence of two
> brackets. What are those brackets doing that makes the former code more
> readable and reasonable than the latter?
>
> Those brackets usually mean "structured binding". But you're* not doing
> structured binding*. You're not decomposing a type; you're creating* new
> variables*.
>
> maybe you'll find a convincing angle, and I for one will happily read it
>> once it's written. The alternatives seem less contentious to me, given
>> prior art,
>>
>
> What prior art?
>
>
>> but I'm open to examining what you have in mind once it's been put in
>> proposal form.
>>
>
>
> --
> 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/20e52a58-1947-4cb9-
> 8ab0-d6a46a064e88%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/20e52a58-1947-4cb9-8ab0-d6a46a064e88%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CAKiZDp3G562fKS0cJJUuMTg0nWYO7zV8zBVv%3DNzVRtiLGkfQRw%40mail.gmail.com.
--f403045e765cf4634e056235812f
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>With respect to "what prior art", I had the=
lambda capture syntax and the structured binding syntax, both of which str=
ongly resemble the original proposition in this thread. I understand the in=
terest for the multiple types, single auto declaration, but I don't see=
an existing case such as this one currently.<br><br></div>The example prov=
ided by Jake with an implicit cast does not affect the object's type an=
d as such, does not seem like an existing case to me.<br></div><div class=
=3D"gmail_extra"><br><div class=3D"gmail_quote">2018-01-07 12:23 GMT-05:00 =
Nicol Bolas <span dir=3D"ltr"><<a href=3D"mailto:jmckesson@gmail.com" ta=
rget=3D"_blank">jmckesson@gmail.com</a>></span>:<br><blockquote class=3D=
"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding=
-left:1ex"><div dir=3D"ltr"><span class=3D"">On Sunday, January 7, 2018 at =
11:19:21 AM UTC-5, Patrice Roy wrote:<blockquote class=3D"gmail_quote" styl=
e=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc solid;padding-left:1ex=
"><div dir=3D"ltr"><div><div><div><div>I don't think it's a matter =
of sentence length in the standard text. It's more a matter of :<br><br=
></div>int a =3D 2, b =3D 3; // same type<br></div>auto x =3D "hello&q=
uot;s, y =3D 3.14159; // distinct types, quite new; impact on the way peopl=
e write C++? Requires thought, at the very least<br>// ...</div><div>templa=
te <Regular T> void f(T, T); // same type<br></div><div>void g(Regula=
r, Regular); // if short syntax eventually gets in : same type? different t=
ypes?</div><div>void h(auto a, auto b); // same rules as Regular,Regular or=
not? Papers have been written debating both options<br></div><div><br></di=
v></div>If you see single-auto, multiple types as the way to go, I think it=
's a position that deserves a paper. It does not jump as being to path =
to follow in a self-evident manner;</div></blockquote><div><br></div></span=
><div>Why not?</div><div><br></div><div>Why is this "self-evident"=
;:</div><div><br></div><div class=3D"m_-1429508801106519909prettyprint" sty=
le=3D"border:1px solid rgb(187,187,187);word-wrap:break-word;background-col=
or:rgb(250,250,250)"><code class=3D"m_-1429508801106519909prettyprint"><div=
class=3D"m_-1429508801106519909subprettyprint"><span class=3D"m_-142950880=
1106519909styled-by-prettify" style=3D"color:#008">auto</span><span class=
=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#000"> </span>=
<span class=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#66=
0">[</span><span class=3D"m_-1429508801106519909styled-by-prettify" style=
=3D"color:#000">i </span><span class=3D"m_-1429508801106519909styled-by-pre=
ttify" style=3D"color:#660">=3D</span><span class=3D"m_-1429508801106519909=
styled-by-prettify" style=3D"color:#000"> std</span><span class=3D"m_-14295=
08801106519909styled-by-prettify" style=3D"color:#660">::</span><span class=
=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#000">size_t</=
span><span class=3D"m_-1429508801106519909styled-by-prettify" style=3D"colo=
r:#660">(</span><span class=3D"m_-1429508801106519909styled-by-prettify" st=
yle=3D"color:#066">0</span><span class=3D"m_-1429508801106519909styled-by-p=
rettify" style=3D"color:#660">),</span><span class=3D"m_-142950880110651990=
9styled-by-prettify" style=3D"color:#000"> first </span><span class=3D"m_-1=
429508801106519909styled-by-prettify" style=3D"color:#660">=3D</span><span =
class=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#000"> </=
span><span class=3D"m_-1429508801106519909styled-by-prettify" style=3D"colo=
r:#008">begin</span><span class=3D"m_-1429508801106519909styled-by-prettify=
" style=3D"color:#660">(</span><span class=3D"m_-1429508801106519909styled-=
by-prettify" style=3D"color:#000">v</span><span class=3D"m_-142950880110651=
9909styled-by-prettify" style=3D"color:#660">),</span><span class=3D"m_-142=
9508801106519909styled-by-prettify" style=3D"color:#000"> </span><span clas=
s=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#008">last</s=
pan><span class=3D"m_-1429508801106519909styled-by-prettify" style=3D"color=
:#000"> </span><span class=3D"m_-1429508801106519909styled-by-prettify" sty=
le=3D"color:#660">=3D</span><span class=3D"m_-1429508801106519909styled-by-=
prettify" style=3D"color:#000"> </span><span class=3D"m_-142950880110651990=
9styled-by-prettify" style=3D"color:#008">end</span><span class=3D"m_-14295=
08801106519909styled-by-prettify" style=3D"color:#660">(</span><span class=
=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#000">v</span>=
<span class=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#66=
0">)];</span></div></code></div><div><br></div><div>When this is not "=
self-evident":</div><div><br></div><div class=3D"m_-142950880110651990=
9prettyprint" style=3D"border:1px solid rgb(187,187,187);word-wrap:break-wo=
rd;background-color:rgb(250,250,250)"><code class=3D"m_-1429508801106519909=
prettyprint"><div class=3D"m_-1429508801106519909subprettyprint"><span clas=
s=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#008">auto</s=
pan><span class=3D"m_-1429508801106519909styled-by-prettify" style=3D"color=
:#000"> i </span><span class=3D"m_-1429508801106519909styled-by-prettify" s=
tyle=3D"color:#660">=3D</span><span class=3D"m_-1429508801106519909styled-b=
y-prettify" style=3D"color:#000"> std</span><span class=3D"m_-1429508801106=
519909styled-by-prettify" style=3D"color:#660">::</span><span class=3D"m_-1=
429508801106519909styled-by-prettify" style=3D"color:#000">size_t</span><sp=
an class=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#660">=
(</span><span class=3D"m_-1429508801106519909styled-by-prettify" style=3D"c=
olor:#066">0</span><span class=3D"m_-1429508801106519909styled-by-prettify"=
style=3D"color:#660">),</span><span class=3D"m_-1429508801106519909styled-=
by-prettify" style=3D"color:#000"> first </span><span class=3D"m_-142950880=
1106519909styled-by-prettify" style=3D"color:#660">=3D</span><span class=3D=
"m_-1429508801106519909styled-by-prettify" style=3D"color:#000"> </span><sp=
an class=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#008">=
begin</span><span class=3D"m_-1429508801106519909styled-by-prettify" style=
=3D"color:#660">(</span><span class=3D"m_-1429508801106519909styled-by-pret=
tify" style=3D"color:#000">v</span><span class=3D"m_-1429508801106519909sty=
led-by-prettify" style=3D"color:#660">),</span><span class=3D"m_-1429508801=
106519909styled-by-prettify" style=3D"color:#000"> </span><span class=3D"m_=
-1429508801106519909styled-by-prettify" style=3D"color:#008">last</span><sp=
an class=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#000">=
</span><span class=3D"m_-1429508801106519909styled-by-prettify" style=3D"c=
olor:#660">=3D</span><span class=3D"m_-1429508801106519909styled-by-prettif=
y" style=3D"color:#000"> </span><span class=3D"m_-1429508801106519909styled=
-by-prettify" style=3D"color:#008">end</span><span class=3D"m_-142950880110=
6519909styled-by-prettify" style=3D"color:#660">(</span><span class=3D"m_-1=
429508801106519909styled-by-prettify" style=3D"color:#000">v</span><span cl=
ass=3D"m_-1429508801106519909styled-by-prettify" style=3D"color:#660">);</s=
pan></div></code></div><div><div><span><br></span></div><div><span>Literall=
y the only difference between them is the presence of two brackets. What ar=
e those brackets doing that makes the former code more readable and reasona=
ble than the latter?</span></div><div><br></div><div>Those brackets usually=
mean "structured binding". But you're<i> not doing structure=
d binding</i>. You're not decomposing a type; you're creating<i> ne=
w variables</i>.</div><b></b></div><span class=3D""><div><i><br></i></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">maybe you'll fi=
nd a convincing angle, and I for one will happily read it once it's wri=
tten. The alternatives seem less contentious to me, given prior art,</div><=
/blockquote><div><br></div></span><div>What prior art?</div><span class=3D"=
"><div>=C2=A0</div><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"=
>but I'm open to examining what you have in mind once it's been put=
in proposal form.<br></div></blockquote><div>=C2=A0</div></span></div>
<p></p>
-- <br><span class=3D"">
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/20e52a58-1947-4cb9-8ab0-d6a46a064e88%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/20e5=
2a58-1947-4cb9-<wbr>8ab0-d6a46a064e88%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp3G562fKS0cJJUuMTg0nWYO7zV8zBVv=
%3DNzVRtiLGkfQRw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp3G562fKS=
0cJJUuMTg0nWYO7zV8zBVv%3DNzVRtiLGkfQRw%40mail.gmail.com</a>.<br />
--f403045e765cf4634e056235812f--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sun, 7 Jan 2018 15:28:19 -0500
Raw View
--94eb2c035558b907520562358569
Content-Type: text/plain; charset="UTF-8"
Agreed; I merely stated that options were debated, Thanks!
2018-01-07 12:29 GMT-05:00 Ville Voutilainen <ville.voutilainen@gmail.com>:
> On 7 January 2018 at 19:25, Nicol Bolas <jmckesson@gmail.com> wrote:
> >
> >
> > On Sunday, January 7, 2018 at 12:19:16 PM UTC-5, Ville Voutilainen wrote:
> >>
> >> On 7 January 2018 at 18:19, Patrice Roy <patr...@gmail.com> wrote:
> >> > template <Regular T> void f(T, T); // same type
> >> > void g(Regular, Regular); // if short syntax eventually gets in : same
> >> > type?
> >> > different types?
> >> > void h(auto a, auto b); // same rules as Regular,Regular or not?
> Papers
> >> > have
> >> > been written debating both options
> >>
> >> I haven't seen a paper suggesting that h should have two parameters of
> >> the same type,
> >> can you point me to one?
> >
> >
> > Equally importantly, `[](auto a, auto b)` already doesn't do this. So any
> > such paper is going to have a hell of a mountain to climb to explain that
> > inconsistency.
>
> Which is why I proposed allowing 'void f(auto, auto);' and suggested
> that the committee
> has already made its bed on it. Various people claimed they wish to
> see what the outcome
> of the terse syntax discussion is; they remain mistaken.
>
> --
> 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/CAFk2RUbbWbvKY_z%2BDQa4dh6FbU4n%3DCic%
> 2Bd5WnaqVu4_dnn%3D0xg%40mail.gmail.com.
>
--
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/CAKiZDp1khPfBM8BeeyPEHzjBEbh8qwYWEY1zdUB4b1-zQADWbw%40mail.gmail.com.
--94eb2c035558b907520562358569
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Agreed; I merely stated that options were debated, Thanks!=
<br></div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">2018-01=
-07 12:29 GMT-05:00 Ville Voutilainen <span dir=3D"ltr"><<a href=3D"mail=
to:ville.voutilainen@gmail.com" target=3D"_blank">ville.voutilainen@gmail.c=
om</a>></span>:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0=
0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class=3D"">On 7 =
January 2018 at 19:25, Nicol Bolas <<a href=3D"mailto:jmckesson@gmail.co=
m">jmckesson@gmail.com</a>> wrote:<br>
><br>
><br>
> On Sunday, January 7, 2018 at 12:19:16 PM UTC-5, Ville Voutilainen wro=
te:<br>
>><br>
>> On 7 January 2018 at 18:19, Patrice Roy <<a href=3D"mailto:patr=
....@gmail.com">patr...@gmail.com</a>> wrote:<br>
>> > template <Regular T> void f(T, T); // same type<br>
>> > void g(Regular, Regular); // if short syntax eventually gets =
in : same<br>
>> > type?<br>
>> > different types?<br>
>> > void h(auto a, auto b); // same rules as Regular,Regular or n=
ot? Papers<br>
>> > have<br>
>> > been written debating both options<br>
>><br>
>> I haven't seen a paper suggesting that h should have two param=
eters of<br>
>> the same type,<br>
>> can you point me to one?<br>
><br>
><br>
> Equally importantly, `[](auto a, auto b)` already doesn't do this.=
So any<br>
> such paper is going to have a hell of a mountain to climb to explain t=
hat<br>
> inconsistency.<br>
<br>
</span>Which is why I proposed allowing 'void f(auto, auto);' and s=
uggested<br>
that the committee<br>
has already made its bed on it. Various people claimed they wish to<br>
see what the outcome<br>
of the terse syntax discussion is; they remain mistaken.<br>
<span class=3D""><br>
--<br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals%2Bunsubscribe@isocpp.org">std-propo=
sals+unsubscribe@<wbr>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>
</span>To view this discussion on the web visit <a href=3D"https://groups.g=
oogle.com/a/isocpp.org/d/msgid/std-proposals/CAFk2RUbbWbvKY_z%2BDQa4dh6FbU4=
n%3DCic%2Bd5WnaqVu4_dnn%3D0xg%40mail.gmail.com" rel=3D"noreferrer" target=
=3D"_blank">https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>pr=
oposals/CAFk2RUbbWbvKY_z%<wbr>2BDQa4dh6FbU4n%3DCic%<wbr>2Bd5WnaqVu4_dnn%3D0=
xg%40mail.<wbr>gmail.com</a>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp1khPfBM8BeeyPEHzjBEbh8qwYWEY1z=
dUB4b1-zQADWbw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp1khPfBM8Be=
eyPEHzjBEbh8qwYWEY1zdUB4b1-zQADWbw%40mail.gmail.com</a>.<br />
--94eb2c035558b907520562358569--
.
Author: mihailnajdenov@gmail.com
Date: Sun, 7 Jan 2018 14:35:58 -0800 (PST)
Raw View
------=_Part_12410_1221006343.1515364558883
Content-Type: multipart/alternative;
boundary="----=_Part_12411_1321056448.1515364558884"
------=_Part_12411_1321056448.1515364558884
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 7:39:07 PM UTC+2, Nicol Bolas wrote:
>
> ...
>>
>>
>> And one more thing - people are *already* doing it the ugly way!
>>
>> auto i = std::size_t(0), first = begin(v), last = end(v)
>>
>> will *prevent* writing this
>>
>> auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v), end(v))
>>
>> which we both agree is worse!
>>
>
> If people are writing that, then they* deserve* to write it. That's my
> feeling on the matter. Let's make ugly code as ugly as possible, so that
> people will switch to the better code.
>
You are assuming all multiple declarations, written in one line, are bad.
But that is subjective, considering the trade offs, and they are trade offs
- either dummy scopes or some new special classes and functions to fit in
the current model.
Consider a real-world, looping over two images pixels:
for(auto* dst_p = dst_start, *src_p = src_start; *//< only works if the
data is the same type*
dst_p < dst_end;
dst_p += Bpp, src_p += Bpp)
{
// use
}
How is this bad or unclear code? Why should I use special tricks, or extra
scopes, or leak variables? We could argue "you must create a view", but
what if there is performance penalty (compile- and/or runtime). What if it
is an established codebase and/or style?
Why should be able to easily write loops with one variable, but not with
more then one, with a different type?!? That limitation is *arbitrary*,
*technical*, *not* semantic, not even readability one.
And we only got for loop so far. Now even more needs will arise (with the
range-for, if and switch), uses, which make sense, and *make sense* iff the
variables are needed before the test and are excusive for the scope
- the very same rules C++ applied to the counter variable in the original C
for.
--
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/f39d0998-040a-498f-b9c8-1a36c0ad3d96%40isocpp.org.
------=_Part_12411_1321056448.1515364558884
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Sunday, January 7, 2018 at 7:39:07 PM UTC+2, Ni=
col Bolas 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"lt=
r">...<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex=
;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><=
div><span style=3D"display:inline!important;float:none;background-color:tra=
nsparent;color:rgb(34,34,34);font-family:"Arial","Helvetica&=
quot;,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-=
weight:400;letter-spacing:normal;text-align:left;text-decoration:none;text-=
indent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></s=
pan></div><div><span style=3D"display:inline!important;float:none;backgroun=
d-color:transparent;color:rgb(34,34,34);font-family:"Arial","=
;Helvetica",sans-serif;font-size:13px;font-style:normal;font-variant:n=
ormal;font-weight:400;letter-spacing:normal;text-align:left;text-decoration=
:none;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0=
px">And one more thing - people are <i>already</i> doing it the ugly way!</=
span></div><div><span style=3D"display:inline!important;float:none;backgrou=
nd-color:transparent;color:rgb(34,34,34);font-family:"Arial",&quo=
t;Helvetica",sans-serif;font-size:13px;font-style:normal;font-variant:=
normal;font-weight:400;letter-spacing:normal;text-align:left;text-decoratio=
n:none;text-indent:0px;text-transform:none;white-space:normal;word-spacing:=
0px"><br></span></div><div><span style=3D"text-align:left;color:rgb(34,34,3=
4);text-transform:none;text-indent:0px;letter-spacing:normal;font-family:&q=
uot;Arial","Helvetica",sans-serif;font-size:13px;font-varian=
t:normal;word-spacing:0px;display:inline!important;white-space:normal;float=
:none;background-color:transparent"><span style=3D"display:inline!important=
;float:none;background-color:transparent;color:rgb(34,34,34);font-family:co=
urier new,monospace;font-size:13px;font-style:normal;font-variant:normal;fo=
nt-weight:400;letter-spacing:normal;text-align:left;text-decoration:none;te=
xt-indent:0px;text-transform:none;white-space:normal;word-spacing:0px">auto=
i =3D <span style=3D"display:inline!important;float:none;background-color:=
transparent;color:rgb(34,34,34);font-family:courier new,monospace;font-size=
:13px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:=
normal;text-align:left;text-decoration:none;text-indent:0px;text-transform:=
none;white-space:normal;word-spacing:0px">std::size_t(0)</span>, first =3D =
<span style=3D"display:inline!important;float:none;background-color:transpa=
rent;color:rgb(34,34,34);font-family:courier new,monospace;font-size:13px;f=
ont-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;=
text-align:left;text-decoration:none;text-indent:0px;text-transform:none;wh=
ite-space:normal;word-spacing:0px">begin(v)</span>, last =3D end(v)</span><=
/span></div><span style=3D"display:inline!important;float:none;background-c=
olor:transparent;color:rgb(34,34,34);font-family:"Arial","He=
lvetica",sans-serif;font-size:13px;font-style:normal;font-variant:norm=
al;font-weight:400;letter-spacing:normal;text-align:left;text-decoration:no=
ne;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px"=
><div><br></div><div>will <i>prevent</i> writing this</div><div><br></div><=
/span><div><font face=3D"courier new,monospace">auto [i, first, last] =3D s=
td::make_tuple(std::size_t(0)<wbr>, begin(v), end(v))</font><span style=3D"=
display:inline!important;float:none;background-color:transparent;color:rgb(=
34,34,34);font-family:"Arial","Helvetica",sans-serif;fo=
nt-size:13px;font-style:normal;font-variant:normal;font-weight:400;letter-s=
pacing:normal;text-align:left;text-decoration:none;text-indent:0px;text-tra=
nsform:none;white-space:normal;word-spacing:0px"></span></div><div><b><i><b=
r></i></b></div><div>which we both agree is worse!</div></div></blockquote>=
<div><br></div><div>If people are writing that, then they<i> deserve</i> to=
write it. That's my feeling on the matter. Let's make ugly code as=
ugly as possible, so that people will switch to the better code.</div></di=
v></blockquote><div><br></div><div>You are assuming all multiple declaratio=
ns, written in one line, are bad. But that is subjective, considering the t=
rade offs, and they are trade offs - either dummy scopes or some new specia=
l classes and functions to fit in the current model.</div><div><br></div><d=
iv>Consider a real-world, looping over two images pixels:</div><div><font f=
ace=3D"courier new,monospace"><br></font></div><div><font face=3D"courier n=
ew,monospace">for(auto* dst_p =3D dst_start, *src_p =3D src_start; <i>//<=
; only works if the data is the same type</i></font></div><div><font face=
=3D"courier new,monospace">=C2=A0 dst_p < dst_end;</font></div><div><fon=
t face=3D"courier new,monospace">=C2=A0 dst_p +=3D Bpp, src_p +=3D Bpp)<br>=
{</font></div><div><font face=3D"courier new">=C2=A0// use </font>=C2=A0</=
div><div><font face=3D"courier new,monospace"> }</font><br></div><div><b><i=
><font face=3D"courier new,monospace"><font face=3D"courier new,monospace">=
</font><br></font></i></b></div><div>How is this bad or unclear code? Why s=
hould I use special tricks, or extra scopes, or leak variables? We could ar=
gue "you must create a view", but what if there is performance pe=
nalty (compile- and/or runtime). What if it is an established codebase and/=
or style?</div><div><br></div><div>Why should be able to easily write loops=
with one variable, but not with more then one, with a different type?!? Th=
at limitation is <i>arbitrary</i>, <i>technical</i>, <b>not</b> semantic, n=
ot even readability one. =C2=A0</div><div><br></div><div>And we only got <f=
ont face=3D"courier new,monospace">for</font> loop so far. Now even more ne=
eds will arise (with the range-for, if and switch), uses, which make sense,=
and <i>make sense</i> iff the variables are needed before the test and are=
excusive for the scope </div><div>- the very same rules C++ applied to the=
<font face=3D"arial,sans-serif">counter variable </font><font face=3D"aria=
l,sans-serif">in the original C </font><font face=3D"courier new,monospace"=
>for</font>.</div><div><br></div><div><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/f39d0998-040a-498f-b9c8-1a36c0ad3d96%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/f39d0998-040a-498f-b9c8-1a36c0ad3d96=
%40isocpp.org</a>.<br />
------=_Part_12411_1321056448.1515364558884--
------=_Part_12410_1221006343.1515364558883--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sun, 7 Jan 2018 18:38:53 -0500
Raw View
--001a1147e8b44561970562382f11
Content-Type: text/plain; charset="UTF-8"
Small addition : the mention that something like
int a = 3, *p = &a, &r = a;
.... stands as prior art is interesting, and I think it should be part of an
eventual proposal. In this specific statement, auto would probably not
cause much harm, but I think that
char c = 65;
auto a = 3, *p = &c;
.... which would have been an error previously but would pass with a
multi-type, single auto declaration deserves attention (might not be a bad
thing, but is definitely new and deserving of attention). Thanks in advance
to Nicol or whomever will write that paper.
Cheers!
2018-01-07 17:35 GMT-05:00 <mihailnajdenov@gmail.com>:
>
>
> On Sunday, January 7, 2018 at 7:39:07 PM UTC+2, Nicol Bolas wrote:
>>
>> ...
>>>
>>>
>>> And one more thing - people are *already* doing it the ugly way!
>>>
>>> auto i = std::size_t(0), first = begin(v), last = end(v)
>>>
>>> will *prevent* writing this
>>>
>>> auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v),
>>> end(v))
>>>
>>> which we both agree is worse!
>>>
>>
>> If people are writing that, then they* deserve* to write it. That's my
>> feeling on the matter. Let's make ugly code as ugly as possible, so that
>> people will switch to the better code.
>>
>
> You are assuming all multiple declarations, written in one line, are bad.
> But that is subjective, considering the trade offs, and they are trade offs
> - either dummy scopes or some new special classes and functions to fit in
> the current model.
>
> Consider a real-world, looping over two images pixels:
>
> for(auto* dst_p = dst_start, *src_p = src_start; *//< only works if the
> data is the same type*
> dst_p < dst_end;
> dst_p += Bpp, src_p += Bpp)
> {
> // use
> }
>
> How is this bad or unclear code? Why should I use special tricks, or extra
> scopes, or leak variables? We could argue "you must create a view", but
> what if there is performance penalty (compile- and/or runtime). What if it
> is an established codebase and/or style?
>
> Why should be able to easily write loops with one variable, but not with
> more then one, with a different type?!? That limitation is *arbitrary*,
> *technical*, *not* semantic, not even readability one.
>
> And we only got for loop so far. Now even more needs will arise (with the
> range-for, if and switch), uses, which make sense, and *make sense* iff
> the variables are needed before the test and are excusive for the scope
> - the very same rules C++ applied to the counter variable in the original
> C for.
>
>
> --
> 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/f39d0998-040a-498f-
> b9c8-1a36c0ad3d96%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/f39d0998-040a-498f-b9c8-1a36c0ad3d96%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CAKiZDp25XJfbSCmQcVeNmtdokYdEHMsjPxAATBeaO4yc5TDeaw%40mail.gmail.com.
--001a1147e8b44561970562382f11
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Small addition : the mention that something like<br><=
/div><div><br></div><div>int a =3D 3, *p =3D &a, &r =3D a;</div><di=
v><br></div><div>... stands as prior art is interesting, and I think it sho=
uld be part of an eventual proposal.=C2=A0 In this specific statement, auto=
would probably not cause much harm, but I think that</div><div><br></div><=
div>char c =3D 65;<br></div><div>auto a =3D 3, *p =3D &c;</div><div><br=
></div><div>... which would have been an error previously but would pass wi=
th a multi-type, single auto declaration deserves attention (might not be a=
bad thing, but is definitely new and deserving of attention). Thanks in ad=
vance to Nicol or whomever will write that paper.<br></div><div><br></div><=
div>Cheers!<br></div></div><div class=3D"gmail_extra"><br><div class=3D"gma=
il_quote">2018-01-07 17:35 GMT-05:00 <span dir=3D"ltr"><<a href=3D"mail=
to:mihailnajdenov@gmail.com" target=3D"_blank">mihailnajdenov@gmail.com</a>=
></span>:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8e=
x;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><br><br>On =
Sunday, January 7, 2018 at 7:39:07 PM UTC+2, Nicol Bolas 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">...<span class=3D""><blockquot=
e class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px=
#ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div><div><span style=
=3D"display:inline!important;float:none;background-color:transparent;color:=
rgb(34,34,34);font-family:"Arial","Helvetica",sans-seri=
f;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;lett=
er-spacing:normal;text-align:left;text-decoration:none;text-indent:0px;text=
-transform:none;white-space:normal;word-spacing:0px"><br></span></div><div>=
<span style=3D"display:inline!important;float:none;background-color:transpa=
rent;color:rgb(34,34,34);font-family:"Arial","Helvetica"=
;,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-weig=
ht:400;letter-spacing:normal;text-align:left;text-decoration:none;text-inde=
nt:0px;text-transform:none;white-space:normal;word-spacing:0px">And one mor=
e thing - people are <i>already</i> doing it the ugly way!</span></div><div=
><span style=3D"display:inline!important;float:none;background-color:transp=
arent;color:rgb(34,34,34);font-family:"Arial","Helvetica&quo=
t;,sans-serif;font-size:13px;font-style:normal;font-variant:normal;font-wei=
ght:400;letter-spacing:normal;text-align:left;text-decoration:none;text-ind=
ent:0px;text-transform:none;white-space:normal;word-spacing:0px"><br></span=
></div><div><span style=3D"text-align:left;color:rgb(34,34,34);text-transfo=
rm:none;text-indent:0px;letter-spacing:normal;font-family:"Arial"=
,"Helvetica",sans-serif;font-size:13px;font-variant:normal;word-s=
pacing:0px;display:inline!important;white-space:normal;float:none;backgroun=
d-color:transparent"><span style=3D"display:inline!important;float:none;bac=
kground-color:transparent;color:rgb(34,34,34);font-family:courier new,monos=
pace;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;l=
etter-spacing:normal;text-align:left;text-decoration:none;text-indent:0px;t=
ext-transform:none;white-space:normal;word-spacing:0px">auto i =3D <span st=
yle=3D"display:inline!important;float:none;background-color:transparent;col=
or:rgb(34,34,34);font-family:courier new,monospace;font-size:13px;font-styl=
e:normal;font-variant:normal;font-weight:400;letter-spacing:normal;text-ali=
gn:left;text-decoration:none;text-indent:0px;text-transform:none;white-spac=
e:normal;word-spacing:0px">std::size_t(0)</span>, first =3D <span style=3D"=
display:inline!important;float:none;background-color:transparent;color:rgb(=
34,34,34);font-family:courier new,monospace;font-size:13px;font-style:norma=
l;font-variant:normal;font-weight:400;letter-spacing:normal;text-align:left=
;text-decoration:none;text-indent:0px;text-transform:none;white-space:norma=
l;word-spacing:0px">begin(v)</span>, last =3D end(v)</span></span></div><sp=
an style=3D"display:inline!important;float:none;background-color:transparen=
t;color:rgb(34,34,34);font-family:"Arial","Helvetica",s=
ans-serif;font-size:13px;font-style:normal;font-variant:normal;font-weight:=
400;letter-spacing:normal;text-align:left;text-decoration:none;text-indent:=
0px;text-transform:none;white-space:normal;word-spacing:0px"><div><br></div=
><div>will <i>prevent</i> writing this</div><div><br></div></span><div><fon=
t face=3D"courier new,monospace">auto [i, first, last] =3D std::make_tuple(=
std::size_t(0)<wbr>, begin(v), end(v))</font><span style=3D"display:inline!=
important;float:none;background-color:transparent;color:rgb(34,34,34);font-=
family:"Arial","Helvetica",sans-serif;font-size:13px;fo=
nt-style:normal;font-variant:normal;font-weight:400;letter-spacing:normal;t=
ext-align:left;text-decoration:none;text-indent:0px;text-transform:none;whi=
te-space:normal;word-spacing:0px"></span></div><div><b><i><br></i></b></div=
><div>which we both agree is worse!</div></div></blockquote><div><br></div>=
<div>If people are writing that, then they<i> deserve</i> to write it. That=
's my feeling on the matter. Let's make ugly code as ugly as possib=
le, so that people will switch to the better code.</div></span></div></bloc=
kquote><div><br></div><div>You are assuming all multiple declarations, writ=
ten in one line, are bad. But that is subjective, considering the trade off=
s, and they are trade offs - either dummy scopes or some new special classe=
s and functions to fit in the current model.</div><div><br></div><div>Consi=
der a real-world, looping over two images pixels:</div><div><font face=3D"c=
ourier new,monospace"><br></font></div><div><font face=3D"courier new,monos=
pace">for(auto* dst_p =3D dst_start, *src_p =3D src_start; <i>//< only w=
orks if the data is the same type</i></font></div><div><font face=3D"courie=
r new,monospace">=C2=A0 dst_p < dst_end;</font></div><div><font face=3D"=
courier new,monospace">=C2=A0 dst_p +=3D Bpp, src_p +=3D Bpp)<br> {</font><=
/div><div><font face=3D"courier new">=C2=A0// use </font>=C2=A0</div><div><=
font face=3D"courier new,monospace"> }</font><br></div><div><b><i><font fac=
e=3D"courier new,monospace"><font face=3D"courier new,monospace"></font><br=
></font></i></b></div><div>How is this bad or unclear code? Why should I us=
e special tricks, or extra scopes, or leak variables? We could argue "=
you must create a view", but what if there is performance penalty (com=
pile- and/or runtime). What if it is an established codebase and/or style?<=
/div><div><br></div><div>Why should be able to easily write loops with one =
variable, but not with more then one, with a different type?!? That limitat=
ion is <i>arbitrary</i>, <i>technical</i>, <b>not</b> semantic, not even re=
adability one. =C2=A0</div><div><br></div><div>And we only got <font face=
=3D"courier new,monospace">for</font> loop so far. Now even more needs will=
arise (with the range-for, if and switch), uses, which make sense, and <i>=
make sense</i> iff the variables are needed before the test and are excusiv=
e for the scope </div><div>- the very same rules C++ applied to the <font f=
ace=3D"arial,sans-serif">counter variable </font><font face=3D"arial,sans-s=
erif">in the original C </font><font face=3D"courier new,monospace">for</fo=
nt>.</div><div><br></div><div><br></div></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/f39d0998-040a-498f-b9c8-1a36c0ad3d96%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/f39d=
0998-040a-498f-<wbr>b9c8-1a36c0ad3d96%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp25XJfbSCmQcVeNmtdokYdEHMsjPxAA=
TBeaO4yc5TDeaw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp25XJfbSCmQ=
cVeNmtdokYdEHMsjPxAATBeaO4yc5TDeaw%40mail.gmail.com</a>.<br />
--001a1147e8b44561970562382f11--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 7 Jan 2018 15:55:28 -0800 (PST)
Raw View
------=_Part_12549_788643727.1515369328278
Content-Type: multipart/alternative;
boundary="----=_Part_12550_1674979191.1515369328278"
------=_Part_12550_1674979191.1515369328278
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 6:38:56 PM UTC-5, Patrice Roy wrote:
>
> Small addition : the mention that something like
>
> int a = 3, *p = &a, &r = a;
>
> ... stands as prior art is interesting, and I think it should be part of
> an eventual proposal.
>
If you're trying to convince someone that multiple declaration deductions
should deduce different types, you probably shouldn't use an example that's
confusing even without deduction. That's basically like admitting that you
know this proposal opens the door to terrible, illegible, and inscrutable
code, but let's do it anyway.
The best argument for this ability is the iterator/sentinel paradigm.
There's an undeniable reason why you would need them to be in the same
declaration statement. And with the Range TS, the begin/end types are (or
can be) different. We even changed how range-based `for` worked to deal
with this fact.
The iterator/sentinel paradigm is a far better example. At least in that
case, it's clear what's actually going on.
>
--
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/5786bf3b-3bf9-449a-a0bd-f6caecdb375e%40isocpp.org.
------=_Part_12550_1674979191.1515369328278
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, January 7, 2018 at 6:38:56 PM UTC-5, Patrice Ro=
y 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"><div>=
Small addition : the mention that something like<br></div><div><br></div><d=
iv>int a =3D 3, *p =3D &a, &r =3D a;</div><div><br></div><div>... s=
tands as prior art is interesting, and I think it should be part of an even=
tual proposal.</div></div></blockquote><div><br></div><div>If you're tr=
ying to convince someone that multiple declaration deductions should deduce=
different types, you probably shouldn't use an example that's conf=
using even without deduction. That's basically like admitting that you =
know this proposal opens the door to terrible, illegible, and inscrutable c=
ode, but let's do it anyway.</div><div><br></div><div>The best argument=
for this ability is the iterator/sentinel paradigm. There's an undenia=
ble reason why you would need them to be in the same declaration statement.=
And with the Range TS, the begin/end types are (or can be) different. We e=
ven changed how range-based `for` worked to deal with this fact.</div><div>=
<br></div><div>The iterator/sentinel paradigm is a far better example. At l=
east in that case, it's clear what's actually going on.<br></div><b=
lockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;borde=
r-left: 1px #ccc solid;padding-left: 1ex;">
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/5786bf3b-3bf9-449a-a0bd-f6caecdb375e%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/5786bf3b-3bf9-449a-a0bd-f6caecdb375e=
%40isocpp.org</a>.<br />
------=_Part_12550_1674979191.1515369328278--
------=_Part_12549_788643727.1515369328278--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Sun, 7 Jan 2018 19:31:24 -0500
Raw View
--001a114dcaa21b359d056238eb57
Content-Type: text/plain; charset="UTF-8"
I was just following the suggestion of another contributor to this thread.
I maintain you should write a proposal, and I think this deserves
attention. You write well, I'm sure it will be a good proposal.
Thanks!
2018-01-07 18:55 GMT-05:00 Nicol Bolas <jmckesson@gmail.com>:
> On Sunday, January 7, 2018 at 6:38:56 PM UTC-5, Patrice Roy wrote:
>>
>> Small addition : the mention that something like
>>
>> int a = 3, *p = &a, &r = a;
>>
>> ... stands as prior art is interesting, and I think it should be part of
>> an eventual proposal.
>>
>
> If you're trying to convince someone that multiple declaration deductions
> should deduce different types, you probably shouldn't use an example that's
> confusing even without deduction. That's basically like admitting that you
> know this proposal opens the door to terrible, illegible, and inscrutable
> code, but let's do it anyway.
>
> The best argument for this ability is the iterator/sentinel paradigm.
> There's an undeniable reason why you would need them to be in the same
> declaration statement. And with the Range TS, the begin/end types are (or
> can be) different. We even changed how range-based `for` worked to deal
> with this fact.
>
> The iterator/sentinel paradigm is a far better example. At least in that
> case, it's clear what's actually going on.
>
>> --
> 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/5786bf3b-3bf9-449a-
> a0bd-f6caecdb375e%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/5786bf3b-3bf9-449a-a0bd-f6caecdb375e%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CAKiZDp0KTf0X3Rc8BLL24z4P%3D8KEE7Bd91Y7-UFP%3DvPyXfMtnQ%40mail.gmail.com.
--001a114dcaa21b359d056238eb57
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>I was just following the suggestion of another contri=
butor to this thread. I maintain you should write a proposal, and I think t=
his deserves attention. You write well, I'm sure it will be a good prop=
osal.<br><br></div>Thanks!<br></div><div class=3D"gmail_extra"><br><div cla=
ss=3D"gmail_quote">2018-01-07 18:55 GMT-05:00 Nicol Bolas <span dir=3D"ltr"=
><<a href=3D"mailto:jmckesson@gmail.com" target=3D"_blank">jmckesson@gma=
il.com</a>></span>:<br><blockquote class=3D"gmail_quote" style=3D"margin=
:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><=
span class=3D"">On Sunday, January 7, 2018 at 6:38:56 PM UTC-5, Patrice Roy=
wrote:<blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div>Small =
addition : the mention that something like<br></div><div><br></div><div>int=
a =3D 3, *p =3D &a, &r =3D a;</div><div><br></div><div>... stands =
as prior art is interesting, and I think it should be part of an eventual p=
roposal.</div></div></blockquote><div><br></div></span><div>If you're t=
rying to convince someone that multiple declaration deductions should deduc=
e different types, you probably shouldn't use an example that's con=
fusing even without deduction. That's basically like admitting that you=
know this proposal opens the door to terrible, illegible, and inscrutable =
code, but let's do it anyway.</div><div><br></div><div>The best argumen=
t for this ability is the iterator/sentinel paradigm. There's an undeni=
able reason why you would need them to be in the same declaration statement=
.. And with the Range TS, the begin/end types are (or can be) different. We =
even changed how range-based `for` worked to deal with this fact.</div><div=
><br></div><div>The iterator/sentinel paradigm is a far better example. At =
least in that case, it's clear what's actually going on.<br></div><=
blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border=
-left:1px #ccc solid;padding-left:1ex">
</blockquote></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/5786bf3b-3bf9-449a-a0bd-f6caecdb375e%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/5786=
bf3b-3bf9-449a-<wbr>a0bd-f6caecdb375e%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp0KTf0X3Rc8BLL24z4P%3D8KEE7Bd91=
Y7-UFP%3DvPyXfMtnQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp0KTf0X=
3Rc8BLL24z4P%3D8KEE7Bd91Y7-UFP%3DvPyXfMtnQ%40mail.gmail.com</a>.<br />
--001a114dcaa21b359d056238eb57--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 7 Jan 2018 21:40:09 -0800 (PST)
Raw View
------=_Part_13308_847466948.1515390009675
Content-Type: multipart/alternative;
boundary="----=_Part_13309_652843248.1515390009676"
------=_Part_13309_652843248.1515390009676
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 5:35:59 PM UTC-5, mihailn...@gmail.com wrote:
>
> On Sunday, January 7, 2018 at 7:39:07 PM UTC+2, Nicol Bolas wrote:
>>
>> ...
>>>
>>>
>>> And one more thing - people are *already* doing it the ugly way!
>>>
>>> auto i = std::size_t(0), first = begin(v), last = end(v)
>>>
>>> will *prevent* writing this
>>>
>>> auto [i, first, last] = std::make_tuple(std::size_t(0), begin(v), end(v))
>>>
>>> which we both agree is worse!
>>>
>>
>> If people are writing that, then they* deserve* to write it. That's my
>> feeling on the matter. Let's make ugly code as ugly as possible, so that
>> people will switch to the better code.
>>
>
> You are assuming all multiple declarations, written in one line, are bad.
>
No, I'm assuming that enough of them are bad, and enough of them are
sufficiently bad, to counter the number that aren't bad.
But that is subjective, considering the trade offs, and they are trade offs
> - either dummy scopes or some new special classes and functions to fit in
> the current model.
>
"New special classes and functions" that we're* already getting*. And which
make the code much more readable. Let's not forget those parts.
Yes, coding style is somewhat subjective. But that doesn't mean you can
just dismiss criticism of an idea from the grounds of creating bad code. We
shouldn't add features that we know will be misused, unless the absence of
those features makes the language *significantly* worse or eliminates vital
use cases.
I've never seen someone actually argue that manually written loops are a
good thing. It's usually that manually written loops are sometimes
something you have to do, but I don't think I've seen people say that
they're genuinely better code than the alternative.
Consider a real-world, looping over two images pixels:
>
> for(auto* dst_p = dst_start, *src_p = src_start; *//< only works if the
> data is the same type*
> dst_p < dst_end;
> dst_p += Bpp, src_p += Bpp)
> {
> // use
> }
>
> How is this bad or unclear code?
>
It's "bad or unclear" in almost every way that was used to justify
ranged-based `for` in the first place (and many algorithms before that):
1) It's fragile. That loop is an *avalanche* of DRY violations. Mistype one
variable in the wrong place, use `+=` with the wrong increment, and the
loop breaks in a way that's not immediately obvious.
1a) Since the loop variables are visible to the `// use` code, it can
modify them and thus accidentally break them.
2) It's verbose.
3) It introduces variables that aren't actually used. After all, the `//
use` part doesn't care about `src_p` and `dst_p`. It will never modify
those variables; it only uses what they point to.
That's not to say that this is utterly irredeemable or terrible code. But
it's hardly idiomatic, modern C++, is it? Why would you rather have an
easier way to write this code than to have a `std::transform` equivalent
that could be made to work with what you're doing? An algorithm approach
will be more readable.
And we only got for loop so far. Now even more needs will arise (with the
> range-for, if and switch), uses, which make sense, and *make sense* iff
> the variables are needed before the test and are excusive for the scope
>
OK, let's consider that. When exactly would you write an `if` statement
where you declare 2 variables of different types, generated through
different expressions, both of which are needed for the actual conditional
test, and both of which are scoped to the condition statement?
And what does such a condition statement look like? What percentage of it
is just initializing variables, and what percentage of it is the actual
condition itself? Because if your code looks like this:
if(auto big = bag, of = initializer, expression = that, run = on, fore = ver
;
big == of)
{ ... }
Then I think that would look much better as:
{
auto big = bag;
auto of = initializer;
auto expression = that;
auto fore = ver;
if(big == of)
{ ... }
}
If you need that many variables, then those variables are probably pretty
important to what's going on in the code inside the `{...}` part. By
breaking them out of the `if` statement, you put some focus on them. It
also makes the condition itself small enough that it's clear what the
condition itself is actually testing. That makes the code more
maintainable, since you can read the condition itself more easily.
Range-based `for` would have some use for this feature, primarily for doing
zip-range gymnastics across multiple temporary ranges. But every such range
you use this with reduces the difference between this:
for(auto foo1 = get_range1(), foo2 = get_range2(), foo3 = get_range3();
auto &[f1, f2, f3] : zip_range(foo1, foo2, foo3))
and this:
{ auto foo1 = get_range1(); auto foo2 = get_range2(); auto foo3 = get_range3
();
for(auto &[f1, f2, f3] : zip_range(foo1, foo2, foo3))
}
In a perfect world, we would have the ability to explicitly extend the
lifetime of a temporary in some way, and thus we wouldn't need to name
these ranges at all.
- the very same rules C++ applied to the counter variable in the original C
> for.
>
>
>
--
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/a805cc4e-f481-4fdb-aa81-a23779534c9a%40isocpp.org.
------=_Part_13309_652843248.1515390009676
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, January 7, 2018 at 5:35:59 PM UTC-5, mihailn...=
@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;margi=
n-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=3D"l=
tr">On Sunday, January 7, 2018 at 7:39:07 PM UTC+2, Nicol Bolas wrote:<bloc=
kquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-lef=
t:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">...<blockquote class=3D=
"gmail_quote" style=3D"margin:0;margin-left:0.8ex;border-left:1px #ccc soli=
d;padding-left:1ex"><div dir=3D"ltr"><div></div><div><span style=3D"display=
:inline!important;float:none;background-color:transparent;color:rgb(34,34,3=
4);font-family:"Arial","Helvetica",sans-serif;font-size=
:13px;font-style:normal;font-variant:normal;font-weight:400;letter-spacing:=
normal;text-align:left;text-decoration:none;text-indent:0px;text-transform:=
none;white-space:normal;word-spacing:0px"><br></span></div><div><span style=
=3D"display:inline!important;float:none;background-color:transparent;color:=
rgb(34,34,34);font-family:"Arial","Helvetica",sans-seri=
f;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;lett=
er-spacing:normal;text-align:left;text-decoration:none;text-indent:0px;text=
-transform:none;white-space:normal;word-spacing:0px">And one more thing - p=
eople are <i>already</i> doing it the ugly way!</span></div><div><span styl=
e=3D"display:inline!important;float:none;background-color:transparent;color=
:rgb(34,34,34);font-family:"Arial","Helvetica",sans-ser=
if;font-size:13px;font-style:normal;font-variant:normal;font-weight:400;let=
ter-spacing:normal;text-align:left;text-decoration:none;text-indent:0px;tex=
t-transform:none;white-space:normal;word-spacing:0px"><br></span></div><div=
><span style=3D"text-align:left;color:rgb(34,34,34);text-transform:none;tex=
t-indent:0px;letter-spacing:normal;font-family:"Arial","Helv=
etica",sans-serif;font-size:13px;font-variant:normal;word-spacing:0px;=
display:inline!important;white-space:normal;float:none;background-color:tra=
nsparent"><span style=3D"display:inline!important;float:none;background-col=
or:transparent;color:rgb(34,34,34);font-family:courier new,monospace;font-s=
ize:13px;font-style:normal;font-variant:normal;font-weight:400;letter-spaci=
ng:normal;text-align:left;text-decoration:none;text-indent:0px;text-transfo=
rm:none;white-space:normal;word-spacing:0px">auto i =3D <span style=3D"disp=
lay:inline!important;float:none;background-color:transparent;color:rgb(34,3=
4,34);font-family:courier new,monospace;font-size:13px;font-style:normal;fo=
nt-variant:normal;font-weight:400;letter-spacing:normal;text-align:left;tex=
t-decoration:none;text-indent:0px;text-transform:none;white-space:normal;wo=
rd-spacing:0px">std::size_t(0)</span>, first =3D <span style=3D"display:inl=
ine!important;float:none;background-color:transparent;color:rgb(34,34,34);f=
ont-family:courier new,monospace;font-size:13px;font-style:normal;font-vari=
ant:normal;font-weight:400;letter-spacing:normal;text-align:left;text-decor=
ation:none;text-indent:0px;text-transform:none;white-space:normal;word-spac=
ing:0px">begin(v)</span>, last =3D end(v)</span></span></div><span style=3D=
"display:inline!important;float:none;background-color:transparent;color:rgb=
(34,34,34);font-family:"Arial","Helvetica",sans-serif;f=
ont-size:13px;font-style:normal;font-variant:normal;font-weight:400;letter-=
spacing:normal;text-align:left;text-decoration:none;text-indent:0px;text-tr=
ansform:none;white-space:normal;word-spacing:0px"><div><br></div><div>will =
<i>prevent</i> writing this</div><div><br></div></span><div><font face=3D"c=
ourier new,monospace">auto [i, first, last] =3D std::make_tuple(std::size_t=
(0)<wbr>, begin(v), end(v))</font><span style=3D"display:inline!important;f=
loat:none;background-color:transparent;color:rgb(34,34,34);font-family:&quo=
t;Arial","Helvetica",sans-serif;font-size:13px;font-style:no=
rmal;font-variant:normal;font-weight:400;letter-spacing:normal;text-align:l=
eft;text-decoration:none;text-indent:0px;text-transform:none;white-space:no=
rmal;word-spacing:0px"></span></div><div><b><i><br></i></b></div><div>which=
we both agree is worse!</div></div></blockquote><div><br></div><div>If peo=
ple are writing that, then they<i> deserve</i> to write it. That's my f=
eeling on the matter. Let's make ugly code as ugly as possible, so that=
people will switch to the better code.</div></div></blockquote><div><br></=
div><div>You are assuming all multiple declarations, written in one line, a=
re bad.</div></div></blockquote><div><br></div><div>No, I'm assuming th=
at enough of them are bad, and enough of them are sufficiently bad, to coun=
ter the number that aren't bad.</div><div><br></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"><div>But that is subjective, c=
onsidering the trade offs, and they are trade offs - either dummy scopes or=
some new special classes and functions to fit in the current model.</div><=
/div></blockquote><div><br></div><div>"New special classes and functio=
ns" that we're<i> already getting</i>. And which make the code muc=
h more readable. Let's not forget those parts.</div><div><br></div><div=
>Yes, coding style is somewhat subjective. But that doesn't mean you ca=
n just dismiss criticism of an idea from the grounds of creating bad code. =
We shouldn't add features that we know will be misused, unless the abse=
nce of those features makes the language <i>significantly</i> worse or elim=
inates vital use cases.</div><div><br></div><div>I've never seen someon=
e actually argue that manually written loops are a good thing. It's usu=
ally that manually written loops are sometimes something you have to do, bu=
t I don't think I've seen people say that they're genuinely bet=
ter code than the alternative.</div><div><i></i><i></i><br></div><blockquot=
e 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>Consider a real-wo=
rld, looping over two images pixels:</div><div><font face=3D"courier new,mo=
nospace"><br></font></div><div><font face=3D"courier new,monospace">for(aut=
o* dst_p =3D dst_start, *src_p =3D src_start; <i>//< only works if the d=
ata is the same type</i></font></div><div><font face=3D"courier new,monospa=
ce">=C2=A0 dst_p < dst_end;</font></div><div><font face=3D"courier new,m=
onospace">=C2=A0 dst_p +=3D Bpp, src_p +=3D Bpp)<br> {</font></div><div><fo=
nt face=3D"courier new">=C2=A0// use </font>=C2=A0</div><div><font face=3D"=
courier new,monospace"> }</font><br></div><div><b><i><font face=3D"courier =
new,monospace"><font face=3D"courier new,monospace"></font><br></font></i><=
/b></div><div>How is this bad or unclear code?</div></div></blockquote><div=
><br></div><div>It's "bad or unclear" in almost every way tha=
t was used to justify ranged-based `for` in the first place (and many algor=
ithms before that):</div><div><br></div><div>1) It's fragile. That loop=
is an <i>avalanche</i> of DRY violations. Mistype one variable in the wron=
g place, use `+=3D` with the wrong increment, and the loop breaks in a way =
that's not immediately obvious.</div><div>1a) Since the loop variables =
are visible to the `// use` code, it can modify them and thus accidentally =
break them.</div><div>2) It's verbose.</div><div>3) It introduces varia=
bles that aren't actually used. After all, the `// use` part doesn'=
t care about `src_p` and `dst_p`. It will never modify those variables; it =
only uses what they point to.</div><div><br></div><div>That's not to sa=
y that this is utterly irredeemable or terrible code. But it's hardly i=
diomatic, modern C++, is it? Why would you rather have an easier way to wri=
te this code than to have a `std::transform` equivalent that could be made =
to work with what you're doing? An algorithm approach will be more read=
able.</div><div><br></div><blockquote class=3D"gmail_quote" style=3D"margin=
: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div=
dir=3D"ltr"><div></div><div>And we only got <font face=3D"courier new,mono=
space">for</font> loop so far. Now even more needs will arise (with the ran=
ge-for, if and switch), uses, which make sense, and <i>make sense</i> iff t=
he variables are needed before the test and are excusive for the scope</div=
></div></blockquote><div><br></div><div>OK, let's consider that. When e=
xactly would you write an `if` statement where you declare 2 variables of d=
ifferent types, generated through different expressions, both of which are =
needed for the actual conditional test, and both of which are scoped to the=
condition statement?</div><div><br></div><div>And what does such a conditi=
on statement look like? What percentage of it is just initializing variable=
s, and what percentage of it is the actual condition itself? Because if you=
r code looks like this:</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: #008;">if</=
span><span class=3D"styled-by-prettify" style=3D"color: #660;">(</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #008;">auto</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;"> big </span><span class=3D"=
styled-by-prettify" style=3D"color: #660;">=3D</span><span class=3D"styled-=
by-prettify" style=3D"color: #000;"> bag</span><span class=3D"styled-by-pre=
ttify" style=3D"color: #660;">,</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;"> of </span><span class=3D"styled-by-prettify" style=3D=
"color: #660;">=3D</span><span class=3D"styled-by-prettify" style=3D"color:=
#000;"> initializer</span><span class=3D"styled-by-prettify" style=3D"colo=
r: #660;">,</span><span class=3D"styled-by-prettify" style=3D"color: #000;"=
> expression </span><span class=3D"styled-by-prettify" style=3D"color: #660=
;">=3D</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> tha=
t</span><span class=3D"styled-by-prettify" style=3D"color: #660;">,</span><=
span class=3D"styled-by-prettify" style=3D"color: #000;"> run </span><span =
class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><span class=
=3D"styled-by-prettify" style=3D"color: #000;"> on</span><span class=3D"sty=
led-by-prettify" style=3D"color: #660;">,</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #000;"> fore </span><span class=3D"styled-by-pretti=
fy" style=3D"color: #660;">=3D</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #000;"> ver</span><span class=3D"styled-by-prettify" style=3D"=
color: #660;">;</span><span class=3D"styled-by-prettify" style=3D"color: #0=
00;"><br>=C2=A0 big </span><span class=3D"styled-by-prettify" style=3D"colo=
r: #660;">=3D=3D</span><span class=3D"styled-by-prettify" style=3D"color: #=
000;"> of</span><span class=3D"styled-by-prettify" style=3D"color: #660;">)=
</span><span class=3D"styled-by-prettify" style=3D"color: #000;"><br></span=
><span class=3D"styled-by-prettify" style=3D"color: #660;">{</span><span cl=
ass=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"st=
yled-by-prettify" style=3D"color: #660;">...</span><span class=3D"styled-by=
-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify=
" style=3D"color: #660;">}</span></div></code></div><div><br></div><div>The=
n I think that would look much better as:</div><div><br></div><div class=3D=
"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); word-wrap: bre=
ak-word; background-color: rgb(250, 250, 250);"><code class=3D"prettyprint"=
><div class=3D"subprettyprint"><span class=3D"styled-by-prettify" style=3D"=
color: #660;">{</span><span class=3D"styled-by-prettify" style=3D"color: #0=
00;"><br>=C2=A0 </span><span class=3D"styled-by-prettify" style=3D"color: #=
008;">auto</span><span class=3D"styled-by-prettify" style=3D"color: #000;">=
big </span><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</=
span><span class=3D"styled-by-prettify" style=3D"color: #000;"> bag</span><=
span class=3D"styled-by-prettify" style=3D"color: #660;">;</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;"><br>=C2=A0 </span><span cla=
ss=3D"styled-by-prettify" style=3D"color: #008;">auto</span><span class=3D"=
styled-by-prettify" style=3D"color: #000;"> of </span><span class=3D"styled=
-by-prettify" style=3D"color: #660;">=3D</span><span class=3D"styled-by-pre=
ttify" style=3D"color: #000;"> initializer</span><span class=3D"styled-by-p=
rettify" style=3D"color: #660;">;</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;">auto</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> expression </span><span class=3D"styled-by-prettify" sty=
le=3D"color: #660;">=3D</span><span class=3D"styled-by-prettify" style=3D"c=
olor: #000;"> that</span><span class=3D"styled-by-prettify" style=3D"color:=
#660;">;</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;">=
auto</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> fore =
</span><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span>=
<span class=3D"styled-by-prettify" style=3D"color: #000;"> ver</span><span =
class=3D"styled-by-prettify" style=3D"color: #660;">;</span><span class=3D"=
styled-by-prettify" style=3D"color: #000;"><br><br>=C2=A0 </span><span clas=
s=3D"styled-by-prettify" style=3D"color: #008;">if</span><span class=3D"sty=
led-by-prettify" style=3D"color: #660;">(</span><span class=3D"styled-by-pr=
ettify" style=3D"color: #000;">big </span><span class=3D"styled-by-prettify=
" style=3D"color: #660;">=3D=3D</span><span class=3D"styled-by-prettify" st=
yle=3D"color: #000;"> of</span><span class=3D"styled-by-prettify" style=3D"=
color: #660;">)</span><span class=3D"styled-by-prettify" style=3D"color: #0=
00;"><br>=C2=A0 </span><span class=3D"styled-by-prettify" style=3D"color: #=
660;">{</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> </=
span><span class=3D"styled-by-prettify" style=3D"color: #660;">...</span><s=
pan class=3D"styled-by-prettify" style=3D"color: #000;"> </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><span class=3D"styled-by-p=
rettify" style=3D"color: #660;">}</span></div></code></div><div><br></div><=
div>If you need that many variables, then those variables are probably pret=
ty important to what's going on in the code inside the `{...}` part. By=
breaking them out of the `if` statement, you put some focus on them. It al=
so makes the condition itself small enough that it's clear what the con=
dition itself is actually testing. That makes the code more maintainable, s=
ince you can read the condition itself more easily.</div><div><br></div><di=
v>Range-based `for` would have some use for this feature, primarily for doi=
ng zip-range gymnastics across multiple temporary ranges. But every such ra=
nge you use this with reduces the difference between this:</div><div><br></=
div><div class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187=
); word-wrap: break-word; background-color: rgb(250, 250, 250);"><code clas=
s=3D"prettyprint"><div class=3D"subprettyprint"><span class=3D"styled-by-pr=
ettify" style=3D"color: #008;">for</span><span class=3D"styled-by-prettify"=
style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=3D=
"color: #008;">auto</span><span class=3D"styled-by-prettify" style=3D"color=
: #000;"> foo1 </span><span class=3D"styled-by-prettify" style=3D"color: #6=
60;">=3D</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> g=
et_range1</span><span class=3D"styled-by-prettify" style=3D"color: #660;">(=
),</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> foo2 </=
span><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><s=
pan class=3D"styled-by-prettify" style=3D"color: #000;"> get_range2</span><=
span class=3D"styled-by-prettify" style=3D"color: #660;">(),</span><span cl=
ass=3D"styled-by-prettify" style=3D"color: #000;"> foo3 </span><span class=
=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><span class=3D"sty=
led-by-prettify" style=3D"color: #000;"> get_range3</span><span class=3D"st=
yled-by-prettify" style=3D"color: #660;">();</span><span class=3D"styled-by=
-prettify" style=3D"color: #000;"><br>=C2=A0 </span><span class=3D"styled-b=
y-prettify" style=3D"color: #008;">auto</span><span class=3D"styled-by-pret=
tify" style=3D"color: #000;"> </span><span class=3D"styled-by-prettify" sty=
le=3D"color: #660;">&[</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;">f1</span><span class=3D"styled-by-prettify" style=3D"colo=
r: #660;">,</span><span class=3D"styled-by-prettify" style=3D"color: #000;"=
> f2</span><span class=3D"styled-by-prettify" style=3D"color: #660;">,</spa=
n><span class=3D"styled-by-prettify" style=3D"color: #000;"> f3</span><span=
class=3D"styled-by-prettify" style=3D"color: #660;">]</span><span class=3D=
"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-b=
y-prettify" style=3D"color: #660;">:</span><span class=3D"styled-by-prettif=
y" style=3D"color: #000;"> zip_range</span><span class=3D"styled-by-prettif=
y" style=3D"color: #660;">(</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;">foo1</span><span class=3D"styled-by-prettify" style=3D"co=
lor: #660;">,</span><span class=3D"styled-by-prettify" style=3D"color: #000=
;"> foo2</span><span class=3D"styled-by-prettify" style=3D"color: #660;">,<=
/span><span class=3D"styled-by-prettify" style=3D"color: #000;"> foo3</span=
><span class=3D"styled-by-prettify" style=3D"color: #660;">))</span></div><=
/code></div><div><br></div><div>and this:</div><div><br></div><div class=3D=
"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); word-wrap: bre=
ak-word; background-color: rgb(250, 250, 250);"><code class=3D"prettyprint"=
><div class=3D"subprettyprint"><span class=3D"styled-by-prettify" style=3D"=
color: #660;">{</span><span class=3D"styled-by-prettify" style=3D"color: #0=
00;"> </span><span class=3D"styled-by-prettify" style=3D"color: #008;">auto=
</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> foo1 </sp=
an><span class=3D"styled-by-prettify" style=3D"color: #660;">=3D</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #000;"> get_range1</span><sp=
an class=3D"styled-by-prettify" style=3D"color: #660;">();</span><span clas=
s=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=3D"styl=
ed-by-prettify" style=3D"color: #008;">auto</span><span class=3D"styled-by-=
prettify" style=3D"color: #000;"> foo2 </span><span class=3D"styled-by-pret=
tify" style=3D"color: #660;">=3D</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: #000;"> get_range2</span><span class=3D"styled-by-prettify" =
style=3D"color: #660;">();</span><span class=3D"styled-by-prettify" style=
=3D"color: #000;"> </span><span class=3D"styled-by-prettify" style=3D"color=
: #008;">auto</span><span class=3D"styled-by-prettify" style=3D"color: #000=
;"> foo3 </span><span class=3D"styled-by-prettify" style=3D"color: #660;">=
=3D</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> get_ra=
nge3</span><span class=3D"styled-by-prettify" style=3D"color: #660;">();</s=
pan><span class=3D"styled-by-prettify" style=3D"color: #000;"><br>=C2=A0 </=
span><span class=3D"styled-by-prettify" style=3D"color: #008;">for</span><s=
pan class=3D"styled-by-prettify" style=3D"color: #660;">(</span><span class=
=3D"styled-by-prettify" style=3D"color: #008;">auto</span><span class=3D"st=
yled-by-prettify" style=3D"color: #000;"> </span><span class=3D"styled-by-p=
rettify" style=3D"color: #660;">&[</span><span class=3D"styled-by-prett=
ify" style=3D"color: #000;">f1</span><span class=3D"styled-by-prettify" sty=
le=3D"color: #660;">,</span><span class=3D"styled-by-prettify" style=3D"col=
or: #000;"> f2</span><span class=3D"styled-by-prettify" style=3D"color: #66=
0;">,</span><span class=3D"styled-by-prettify" style=3D"color: #000;"> f3</=
span><span class=3D"styled-by-prettify" style=3D"color: #660;">]</span><spa=
n class=3D"styled-by-prettify" style=3D"color: #000;"> </span><span class=
=3D"styled-by-prettify" style=3D"color: #660;">:</span><span class=3D"style=
d-by-prettify" style=3D"color: #000;"> zip_range</span><span class=3D"style=
d-by-prettify" style=3D"color: #660;">(</span><span class=3D"styled-by-pret=
tify" style=3D"color: #000;">foo1</span><span class=3D"styled-by-prettify" =
style=3D"color: #660;">,</span><span class=3D"styled-by-prettify" style=3D"=
color: #000;"> foo2</span><span class=3D"styled-by-prettify" style=3D"color=
: #660;">,</span><span class=3D"styled-by-prettify" style=3D"color: #000;">=
foo3</span><span class=3D"styled-by-prettify" style=3D"color: #660;">))</s=
pan><span class=3D"styled-by-prettify" style=3D"color: #000;"><br></span><s=
pan class=3D"styled-by-prettify" style=3D"color: #660;">}</span></div></cod=
e></div><div><div style=3D"background-color: transparent; border-bottom-col=
or: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; b=
order-image-outset: 0; border-image-repeat: stretch; border-image-slice: 10=
0%; border-image-source: none; border-image-width: 1; border-left-color: rg=
b(34, 34, 34); border-left-style: none; border-left-width: 0px; border-righ=
t-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px=
; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wid=
th: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&am=
p;quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal;=
font-variant: normal; font-weight: 400; letter-spacing: normal; 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: normal; word-spacing=
: 0px;"><br></div><div style=3D"background-color: transparent; border-botto=
m-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0=
px; border-image-outset: 0; border-image-repeat: stretch; border-image-slic=
e: 100%; border-image-source: none; border-image-width: 1; border-left-colo=
r: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(34, 34, 34); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-to=
p-width: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot=
;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: no=
rmal; font-variant: normal; font-weight: 400; letter-spacing: normal; margi=
n-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphan=
s: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-tr=
ansform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-sp=
acing: 0px;">In a perfect world, we would have the ability to explicitly ex=
tend the lifetime of a temporary in some way, and thus we wouldn't need=
to name these ranges at all.<br></div></div><div><br></div><blockquote cla=
ss=3D"gmail_quote" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #=
ccc solid;padding-left: 1ex;"><div dir=3D"ltr"><div>- the very same rules C=
++ applied to the <font face=3D"arial,sans-serif">counter variable </font><=
font face=3D"arial,sans-serif">in the original C </font><font face=3D"couri=
er new,monospace">for</font>.</div><div><br></div><div><br></div></div></bl=
ockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/a805cc4e-f481-4fdb-aa81-a23779534c9a%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/a805cc4e-f481-4fdb-aa81-a23779534c9a=
%40isocpp.org</a>.<br />
------=_Part_13309_652843248.1515390009676--
------=_Part_13308_847466948.1515390009675--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 7 Jan 2018 21:41:35 -0800 (PST)
Raw View
------=_Part_13425_1617691764.1515390095528
Content-Type: multipart/alternative;
boundary="----=_Part_13426_211279539.1515390095529"
------=_Part_13426_211279539.1515390095529
Content-Type: text/plain; charset="UTF-8"
On Sunday, January 7, 2018 at 7:31:27 PM UTC-5, Patrice Roy wrote:
>
> I was just following the suggestion of another contributor to this thread.
> I maintain you should write a proposal, and I think this deserves
> attention. You write well, I'm sure it will be a good proposal.
>
You don't quite seem to get this: I don't particularly want to see*
anything* from this thread actually happen. I'm content with the status
quo, with regard to variable declarations (well, I'd like to see some
changes to structured binding, but *not* in this direction).
My position is merely that, if we're* going* to have a way to declare
multiple variables with multiple deduced types in one statement, then it
should be spelled the obvious way: with `auto`.* Just* `auto`; no
meaningless brackets.
This is better in every respect than any structured binding solution. It's
syntactically better (the syntax already exists; it just is forbidden).
It's semantically better (you're using the syntax that already means
"create multiple variables via deduction"; it just so happens to be
deducing different types now). It's better standard-wise (removing half of
a sentence vs. creating entire new grammar rules). And it's easier on
implementations (removing the code that prevents a scenario you can already
parse vs. adding new grammar parsing code).
That it is better than structured binding solutions does not mean I think
it's a good idea. I merely consider it the correct way to implement
functionality I don't want to see provided.
>
--
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/43d789dc-8409-48e4-99e4-c41907365597%40isocpp.org.
------=_Part_13426_211279539.1515390095529
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, January 7, 2018 at 7:31:27 PM UTC-5, Patrice Ro=
y 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"><div>=
I was just following the suggestion of another contributor to this thread. =
I maintain you should write a proposal, and I think this deserves attention=
.. You write well, I'm sure it will be a good proposal.<br></div></div><=
/blockquote><div>=C2=A0</div><div>You don't quite seem to get this: I d=
on't particularly want to see<i> anything</i> from this thread actually=
happen. I'm content with the status quo, with regard to variable decla=
rations (well, I'd like to see some changes to structured binding, but =
<i>not</i> in this direction).</div><div><br></div><div>My position is mere=
ly that, if we're<i> going</i> to have a way to declare multiple variab=
les with multiple deduced types in one statement, then it should be spelled=
the obvious way: with `auto`.<i> Just</i> `auto`; no meaningless brackets.=
</div><div><br></div><div>This is better in every respect than any structur=
ed binding solution. It's syntactically better (the syntax already exis=
ts; it just is forbidden). It's semantically better (you're using t=
he syntax that already means "create multiple variables via deduction&=
quot;; it just so happens to be deducing different types now). It's bet=
ter standard-wise (removing half of a sentence vs. creating entire new gram=
mar rules). And it's easier on implementations (removing the code that =
prevents a scenario you can already parse vs. adding new grammar parsing co=
de).</div><div><br></div><div>That it is better than structured binding sol=
utions does not mean I think it's a good idea. I merely consider it the=
correct way to implement functionality I don't want to see provided.<b=
r></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;margin-left: 0=
..8ex;border-left: 1px #ccc solid;padding-left: 1ex;">
</blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/43d789dc-8409-48e4-99e4-c41907365597%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/43d789dc-8409-48e4-99e4-c41907365597=
%40isocpp.org</a>.<br />
------=_Part_13426_211279539.1515390095529--
------=_Part_13425_1617691764.1515390095528--
.
Author: Nicolas Lesser <blitzrakete@gmail.com>
Date: Sun, 7 Jan 2018 22:52:13 -0800 (PST)
Raw View
------=_Part_405_1843939929.1515394333435
Content-Type: text/plain; charset="UTF-8"
I also find this proposal, and the proposal to use auto without brackets a not so good one.
As you said, defining multiple variables in a single line is not very pretty, and in fact, the CppCoreGuidelines discourage it too:
https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#Res-name-one
--
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/03d8e0e4-aa8a-455f-89e5-c670bc8b3545%40isocpp.org.
------=_Part_405_1843939929.1515394333435--
.
Author: Patrice Roy <patricer@gmail.com>
Date: Mon, 8 Jan 2018 03:06:55 -0500
Raw View
--f403045daebe24598705623f4840
Content-Type: text/plain; charset="UTF-8"
That's a different story altogether, then. Thanks for clarifying your
position.
2018-01-08 0:41 GMT-05:00 Nicol Bolas <jmckesson@gmail.com>:
> On Sunday, January 7, 2018 at 7:31:27 PM UTC-5, Patrice Roy wrote:
>>
>> I was just following the suggestion of another contributor to this
>> thread. I maintain you should write a proposal, and I think this deserves
>> attention. You write well, I'm sure it will be a good proposal.
>>
>
> You don't quite seem to get this: I don't particularly want to see*
> anything* from this thread actually happen. I'm content with the status
> quo, with regard to variable declarations (well, I'd like to see some
> changes to structured binding, but *not* in this direction).
>
> My position is merely that, if we're* going* to have a way to declare
> multiple variables with multiple deduced types in one statement, then it
> should be spelled the obvious way: with `auto`.* Just* `auto`; no
> meaningless brackets.
>
> This is better in every respect than any structured binding solution. It's
> syntactically better (the syntax already exists; it just is forbidden).
> It's semantically better (you're using the syntax that already means
> "create multiple variables via deduction"; it just so happens to be
> deducing different types now). It's better standard-wise (removing half of
> a sentence vs. creating entire new grammar rules). And it's easier on
> implementations (removing the code that prevents a scenario you can already
> parse vs. adding new grammar parsing code).
>
> That it is better than structured binding solutions does not mean I think
> it's a good idea. I merely consider it the correct way to implement
> functionality I don't want to see provided.
>
>> --
> 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/43d789dc-8409-48e4-
> 99e4-c41907365597%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/43d789dc-8409-48e4-99e4-c41907365597%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
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/CAKiZDp2ca-DqwZxKO4PpAGAc3EVsDP%2BPD3b17WzuH-Ph2V%2BYpg%40mail.gmail.com.
--f403045daebe24598705623f4840
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">That's a different story altogether, then. Thanks for =
clarifying your position.<br></div><div class=3D"gmail_extra"><br><div clas=
s=3D"gmail_quote">2018-01-08 0:41 GMT-05:00 Nicol Bolas <span dir=3D"ltr">&=
lt;<a href=3D"mailto:jmckesson@gmail.com" target=3D"_blank">jmckesson@gmail=
..com</a>></span>:<br><blockquote class=3D"gmail_quote" style=3D"margin:0=
0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><sp=
an class=3D"">On Sunday, January 7, 2018 at 7:31:27 PM UTC-5, Patrice Roy w=
rote:<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>I was ju=
st following the suggestion of another contributor to this thread. I mainta=
in you should write a proposal, and I think this deserves attention. You wr=
ite well, I'm sure it will be a good proposal.<br></div></div></blockqu=
ote><div>=C2=A0</div></span><div>You don't quite seem to get this: I do=
n't particularly want to see<i> anything</i> from this thread actually =
happen. I'm content with the status quo, with regard to variable declar=
ations (well, I'd like to see some changes to structured binding, but <=
i>not</i> in this direction).</div><div><br></div><div>My position is merel=
y that, if we're<i> going</i> to have a way to declare multiple variabl=
es with multiple deduced types in one statement, then it should be spelled =
the obvious way: with `auto`.<i> Just</i> `auto`; no meaningless brackets.<=
/div><div><br></div><div>This is better in every respect than any structure=
d binding solution. It's syntactically better (the syntax already exist=
s; it just is forbidden). It's semantically better (you're using th=
e syntax that already means "create multiple variables via deduction&q=
uot;; it just so happens to be deducing different types now). It's bett=
er standard-wise (removing half of a sentence vs. creating entire new gramm=
ar rules). And it's easier on implementations (removing the code that p=
revents a scenario you can already parse vs. adding new grammar parsing cod=
e).</div><div><br></div><div>That it is better than structured binding solu=
tions does not mean I think it's a good idea. I merely consider it the =
correct way to implement functionality I don't want to see provided.<br=
></div><blockquote class=3D"gmail_quote" style=3D"margin:0;margin-left:0.8e=
x;border-left:1px #ccc solid;padding-left:1ex">
</blockquote></div><span class=3D"">
<p></p>
-- <br>
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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" target=3D"_=
blank">std-proposals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/43d789dc-8409-48e4-99e4-c41907365597%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/43d7=
89dc-8409-48e4-<wbr>99e4-c41907365597%40isocpp.org</a><wbr>.<br>
</blockquote></div><br></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAKiZDp2ca-DqwZxKO4PpAGAc3EVsDP%2BPD3=
b17WzuH-Ph2V%2BYpg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter"=
>https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAKiZDp2ca-Dq=
wZxKO4PpAGAc3EVsDP%2BPD3b17WzuH-Ph2V%2BYpg%40mail.gmail.com</a>.<br />
--f403045daebe24598705623f4840--
.
Author: mihailnajdenov@gmail.com
Date: Mon, 8 Jan 2018 00:20:17 -0800 (PST)
Raw View
------=_Part_13463_2009593532.1515399617325
Content-Type: multipart/alternative;
boundary="----=_Part_13464_1939896006.1515399617325"
------=_Part_13464_1939896006.1515399617325
Content-Type: text/plain; charset="UTF-8"
*Nicolas*, the point is *we already have* multiple variable declaration
without brackets and *they already support different types* (see above)
- the Right Thing is to stick with that if are to be used at all. And in
some places they are needed because if alternatives are considered inferior
by the programmer (which is subjective)
*Nicol*, I agree with most of your points, including about using a view.
However I don't agree that
{
auto a = geta();
b = getb();
if(hum(a, b))
{
// use a and b
}
}
Is better then.
if(auto a=geta(), b=getb(); hum(a, b))
{
// use a and b
}
Also your example about big bag is not fair as it does not follow the rule
when to consider single line init - the variable to be used both in test
and in scope
if(auto big = bag;
big == initializer)
{
* // 'big' used in test and scope ('initializer' (aka 'of') not used in
scope, no need for a variable!)*
* // declare 'expression' and 'fore' here!!!*
}
if(auto big = bag, of = initializer;
big == of)
{
* // both 'big' and 'of' used in test and scope*
* // declare 'expression' and 'fore' here!!!*
}
Lastly, I also don't like the assumption we know *all* the programmer needs
in terms of variables and types, used for *his* code!
--
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/7fa68e96-3bce-4a03-b365-c222a7128c71%40isocpp.org.
------=_Part_13464_1939896006.1515399617325
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div><b>Nicolas</b>, the point is <i>we already have</i> m=
ultiple variable declaration without brackets and <i>they already support d=
ifferent types</i> (see above) </div><div>- the Right Thing is to stick wit=
h that if are to be used at all. And in some places they are needed because=
if alternatives are considered inferior by the programmer (which is subjec=
tive)</div><div><br></div><div><b>Nicol</b>, I agree with most of your poin=
ts, including about using a view. However I don't agree that</div><div>=
<br></div><div><font face=3D"courier new,monospace">{</font></div><div><fon=
t face=3D"courier new,monospace">=C2=A0 auto a =3D=C2=A0<span style=3D"text=
-align: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0p=
x; letter-spacing: normal; font-size: 13px; font-style: normal; font-varian=
t: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; disp=
lay: inline !important; white-space: normal; orphans: 2; float: none; -webk=
it-text-stroke-width: 0px; background-color: transparent;">geta();</span></=
font></div><div><font face=3D"courier new,monospace"><span style=3D"text-al=
ign: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; =
letter-spacing: normal; font-size: 13px; font-style: normal; font-variant: =
normal; font-weight: 400; text-decoration: none; word-spacing: 0px; display=
: inline !important; white-space: normal; orphans: 2; float: none; -webkit-=
text-stroke-width: 0px; background-color: transparent;">=C2=A0=C2=A0<span s=
tyle=3D"display: inline !important; float: none; background-color: transpar=
ent; color: rgb(34, 34, 34); font-family: courier new,monospace; font-size:=
13px; font-style: normal; font-variant: normal; font-weight: 400; letter-s=
pacing: normal; orphans: 2; text-align: left; text-decoration: none; text-i=
ndent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-spa=
ce: normal; word-spacing: 0px;">b =3D getb();</span></span></font></div><di=
v><span style=3D"text-align: left; color: rgb(34, 34, 34); text-transform: =
none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-style=
: normal; font-variant: normal; font-weight: 400; text-decoration: none; wo=
rd-spacing: 0px; display: inline !important; white-space: normal; orphans: =
2; float: none; -webkit-text-stroke-width: 0px; background-color: transpare=
nt;"><font face=3D"courier new,monospace">=C2=A0 if(<span style=3D"text-ali=
gn: left; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; l=
etter-spacing: normal; font-size: 13px; font-style: normal; font-variant: n=
ormal; font-weight: 400; text-decoration: none; word-spacing: 0px; display:=
inline !important; white-space: normal; orphans: 2; float: none; -webkit-t=
ext-stroke-width: 0px; background-color: transparent;">hum(a, b))</span></f=
ont></span></div><div><span style=3D"text-align: left; color: rgb(34, 34, 3=
4); text-transform: none; text-indent: 0px; letter-spacing: normal; font-si=
ze: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-=
decoration: none; word-spacing: 0px; display: inline !important; white-spac=
e: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; backgro=
und-color: transparent;"><span style=3D"text-align: left; color: rgb(34, 34=
, 34); text-transform: none; text-indent: 0px; letter-spacing: normal; font=
-size: 13px; font-style: normal; font-variant: normal; font-weight: 400; te=
xt-decoration: none; word-spacing: 0px; display: inline !important; white-s=
pace: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; back=
ground-color: transparent;"><font face=3D"courier new,monospace">=C2=A0 {</=
font></span></span></div><div><span style=3D"text-align: left; color: rgb(3=
4, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: normal;=
font-size: 13px; font-style: normal; font-variant: normal; font-weight: 40=
0; text-decoration: none; word-spacing: 0px; display: inline !important; wh=
ite-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px;=
background-color: transparent;"><span style=3D"text-align: left; color: rg=
b(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: norm=
al; font-size: 13px; font-style: normal; font-variant: normal; font-weight:=
400; text-decoration: none; word-spacing: 0px; display: inline !important;=
white-space: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0=
px; background-color: transparent;"><font face=3D"courier new,monospace">=
=C2=A0=C2=A0=C2=A0=C2=A0<span style=3D"text-align: left; color: rgb(34, 34,=
34); text-transform: none; text-indent: 0px; letter-spacing: normal; font-=
size: 13px; font-style: normal; font-variant: normal; font-weight: 400; tex=
t-decoration: none; word-spacing: 0px; display: inline !important; white-sp=
ace: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; backg=
round-color: transparent;">// use a and b</span></font></span></span></div>=
<div><span style=3D"text-align: left; color: rgb(34, 34, 34); text-transfor=
m: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-st=
yle: normal; font-variant: normal; font-weight: 400; text-decoration: none;=
word-spacing: 0px; display: inline !important; white-space: normal; orphan=
s: 2; float: none; -webkit-text-stroke-width: 0px; background-color: transp=
arent;"><span style=3D"text-align: left; color: rgb(34, 34, 34); text-trans=
form: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font=
-style: normal; font-variant: normal; font-weight: 400; text-decoration: no=
ne; word-spacing: 0px; display: inline !important; white-space: normal; orp=
hans: 2; float: none; -webkit-text-stroke-width: 0px; background-color: tra=
nsparent;"><font face=3D"courier new,monospace">=C2=A0 }</font></span></spa=
n></div><div><font face=3D"courier new,monospace">}</font></div><div><font =
face=3D"courier new,monospace"><br></font></div><div>Is better then.</div><=
div><br></div><div><font face=3D"courier new,monospace">if(auto a=3Dgeta(),=
b=3Dgetb(); hum(a, b))</font></div><div><font face=3D"courier new,monospac=
e">{</font></div><div><font face=3D"courier new,monospace">=C2=A0 // use a =
and b</font></div><div><font face=3D"courier new,monospace">}</font></div><=
div><font face=3D"courier new"><br></font></div><div><font face=3D"arial,sa=
ns-serif">Also your example about big bag is not fair as it does not follow=
the rule when to consider single line init - the variable to be used both =
in test and in scope</font></div><div><br></div><div><font face=3D"courier =
new,monospace">if(auto big =3D bag; </font></div><div><font face=3D"courier=
new,monospace">=C2=A0=C2=A0 big =3D=3D <span style=3D"display: inline !imp=
ortant; float: none; background-color: transparent; color: rgb(34, 34, 34);=
font-family: courier new,monospace; font-size: 13px; font-style: normal; f=
ont-variant: normal; font-weight: 400; letter-spacing: normal; orphans: 2; =
text-align: left; text-decoration: none; text-indent: 0px; text-transform: =
none; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0p=
x;">initializer</span>)<br>{=C2=A0</font></div><div><i><font face=3D"courie=
r new,monospace">=C2=A0// </font><font face=3D"courier new,monospace">'=
big' used in test and scope ('<span style=3D"margin: 0px; padding: =
0px; border: 0px rgb(34, 34, 34); border-image: none; text-align: left; col=
or: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing=
: normal; font-family: courier new,monospace; font-size: 13px; font-variant=
: normal; font-weight: 400; text-decoration: none; word-spacing: 0px; displ=
ay: inline; white-space: normal; orphans: 2; float: none; -webkit-text-stro=
ke-width: 0px; background-color: transparent;">initializer' (aka 'o=
f') not used in scope, no need for a variable!)</span></font></i></div>=
<div><font face=3D"courier new"><b><br></b></font></div><div><font face=3D"=
courier new"><i>=C2=A0// declare '<span style=3D"margin: 0px; padding: =
0px; border: 0px rgb(0, 0, 0); border-image: none; text-align: left; color:=
rgb(0, 0, 0); text-transform: none; text-indent: 0px; letter-spacing: norm=
al; font-size: 13px; font-variant: normal; font-weight: 400; text-decoratio=
n: none; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-s=
troke-width: 0px; background-color: transparent;">expression' and '=
fore' here!!!</span></i><span style=3D"margin: 0px; padding: 0px; borde=
r: 0px rgb(102, 102, 0); border-image: none; text-align: left; color: rgb(1=
02, 102, 0); text-transform: none; text-indent: 0px; letter-spacing: normal=
; font-size: 13px; font-variant: normal; font-weight: 400; text-decoration:=
none; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-str=
oke-width: 0px; background-color: transparent;"></span></font></div><div><f=
ont face=3D"courier new,monospace">}</font></div><div><br></div><div><font =
face=3D"courier new,monospace">if(auto big =3D bag, of =3D initializer;<br>=
=C2=A0 =C2=A0 big =3D=3D of)<br>{</font></div><div><font face=3D"courier ne=
w"><i>=C2=A0 // both 'big' and 'of' used in test and scope<=
/i></font></div><div><i><br></i></div><div><i><span style=3D"text-align: le=
ft; color: rgb(34, 34, 34); text-transform: none; text-indent: 0px; letter-=
spacing: normal; font-family: courier new; font-size: 13px; font-variant: n=
ormal; font-weight: 400; text-decoration: none; word-spacing: 0px; display:=
inline !important; white-space: normal; orphans: 2; float: none; -webkit-t=
ext-stroke-width: 0px; background-color: transparent;">=C2=A0// declare =
9;</span><span style=3D"margin: 0px; padding: 0px; border: 0px rgb(0, 0, 0)=
; border-image: none; text-align: left; color: rgb(0, 0, 0); text-transform=
: none; text-indent: 0px; letter-spacing: normal; font-family: courier new;=
font-size: 13px; font-variant: normal; font-weight: 400; text-decoration: =
none; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-text-stro=
ke-width: 0px; background-color: transparent;">expression' and 'for=
e' here!!!</span></i></div><div><font face=3D"courier new,monospace">}<=
/font></div><div><br></div><div><font face=3D"courier new"><b></b><i></i><u=
></u><sub></sub><sup></sup><strike></strike><br></font></div><div><font fac=
e=3D"arial,sans-serif">Lastly, I also don't like the assumption we know=
<i>all</i> the programmer needs in terms of variables and types, used for =
<i>his</i> code!=C2=A0</font></div><div><font face=3D"arial,sans-serif"><fo=
nt face=3D"courier new,monospace"></font><font face=3D"arial,sans-serif"></=
font><br></font></div><blockquote class=3D"gmail_quote" style=3D"margin: 0;=
margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><p></p><=
/blockquote></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/7fa68e96-3bce-4a03-b365-c222a7128c71%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/7fa68e96-3bce-4a03-b365-c222a7128c71=
%40isocpp.org</a>.<br />
------=_Part_13464_1939896006.1515399617325--
------=_Part_13463_2009593532.1515399617325--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Mon, 8 Jan 2018 09:01:50 +0000
Raw View
--001a1149299c91b9dd0562400c33
Content-Type: text/plain; charset="UTF-8"
On 8 Jan 2018 05:40, "Nicol Bolas" <jmckesson@gmail.com> wrote:
3) It introduces variables that aren't actually used. After all, the `//
use` part doesn't care about `src_p` and `dst_p`. It will never modify
those variables; it only uses what they point to.
That's an assumption. For the specific 2d image iteration it very well
might be the case but there are situations in data processing in which it
is not. For example, operations/observations on local windows of data. This
is not uncommon.
For me, any "solution" which removes my access to a range of N elements
before the one explicitly pointed to by the loop iterator is useless.
for(
auto s_first = cbegin(source),
s_last = s_first + N,
dest = begin(destination);
s_last != cend(source);
++s_first, ++s_last, ++dest
){
dest->some_op(s_first, s_last);
}
--
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/CAC%2B0CCMYopHUEWZqPWra8sqafB1tk0S9DDH27xzkSJfAt8odAA%40mail.gmail.com.
--001a1149299c91b9dd0562400c33
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto"><br><div class=3D"gmail_extra" dir=3D"auto"><br><div clas=
s=3D"gmail_quote">On 8 Jan 2018 05:40, "Nicol Bolas" <<a href=
=3D"mailto:jmckesson@gmail.com">jmckesson@gmail.com</a>> wrote:<br type=
=3D"attribution"><blockquote class=3D"quote" style=3D"margin:0 0 0 .8ex;bor=
der-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div class=3D"qu=
oted-text"></div></div></blockquote></div></div><div class=3D"gmail_extra" =
dir=3D"auto"><div class=3D"gmail_quote"><blockquote class=3D"quote" style=
=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=
=3D"ltr"><div><br></div><div>3) It introduces variables that aren't act=
ually used. After all, the `// use` part doesn't care about `src_p` and=
`dst_p`. It will never modify those variables; it only uses what they poin=
t to.</div></div></blockquote></div></div><div dir=3D"auto"><br></div><div =
dir=3D"auto">That's an assumption. For the specific 2d image iteration =
it very well might be the case but there are situations in data processing =
in which it is not. For example, operations/observations on local windows o=
f data. This is not uncommon.</div><div dir=3D"auto"><br></div><div dir=3D"=
auto">For me, any "solution" which removes my access to a range o=
f N elements before the one explicitly pointed to by the loop iterator is u=
seless.</div><div dir=3D"auto"><br></div><div dir=3D"auto">for(</div><div d=
ir=3D"auto">=C2=A0 =C2=A0 auto s_first =3D cbegin(source),</div><div dir=3D=
"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s_last =3D s_first +=
N,</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
dest =3D begin(destination);</div><div dir=3D"auto">=C2=A0 =C2=A0 s_last !=
=3D cend(source);</div><div dir=3D"auto">=C2=A0 =C2=A0 ++s_first, ++s_last,=
++dest</div><div dir=3D"auto">){</div><div dir=3D"auto">=C2=A0 =C2=A0 dest=
->some_op(s_first, s_last);</div><div dir=3D"auto">}</div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCMYopHUEWZqPWra8sqafB1tk0S9DD=
H27xzkSJfAt8odAA%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCMYopHU=
EWZqPWra8sqafB1tk0S9DDH27xzkSJfAt8odAA%40mail.gmail.com</a>.<br />
--001a1149299c91b9dd0562400c33--
.
Author: inkwizytoryankes@gmail.com
Date: Mon, 8 Jan 2018 06:21:06 -0800 (PST)
Raw View
------=_Part_6930_1385128113.1515421267066
Content-Type: multipart/alternative;
boundary="----=_Part_6931_1253375822.1515421267066"
------=_Part_6931_1253375822.1515421267066
Content-Type: text/plain; charset="UTF-8"
On Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrote:
>
>
>
> On 8 Jan 2018 05:40, "Nicol Bolas" <jmck...@gmail.com <javascript:>>
> wrote:
>
>
> 3) It introduces variables that aren't actually used. After all, the `//
> use` part doesn't care about `src_p` and `dst_p`. It will never modify
> those variables; it only uses what they point to.
>
>
> That's an assumption. For the specific 2d image iteration it very well
> might be the case but there are situations in data processing in which it
> is not. For example, operations/observations on local windows of data. This
> is not uncommon.
>
> For me, any "solution" which removes my access to a range of N elements
> before the one explicitly pointed to by the loop iterator is useless.
>
> for(
> auto s_first = cbegin(source),
> s_last = s_first + N,
> dest = begin(destination);
> s_last != cend(source);
> ++s_first, ++s_last, ++dest
> ){
> dest->some_op(s_first, s_last);
> }
>
I would prefer it to look like:
for (auto& [range, dest] : zip(range_window(source, N), destination))
{
dest.some_op(range.begin(), range.end());
}
--
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/f63c9a39-a57f-4f2c-8ed5-e77f041ff67c%40isocpp.org.
------=_Part_6931_1253375822.1515421267066
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Monday, January 8, 2018 at 10:01:53 AM UTC+1, J=
ake Arkinstall wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"auto"><br><div dir=3D"auto"><br><div class=3D"gmail_quote">On 8 Jan 201=
8 05:40, "Nicol Bolas" <<a href=3D"javascript:" target=3D"_bla=
nk" gdf-obfuscated-mailto=3D"R8hApJsOAAAJ" rel=3D"nofollow" onmousedown=3D"=
this.href=3D'javascript:';return true;" onclick=3D"this.href=3D'=
;javascript:';return true;">jmck...@gmail.com</a>> wrote:<br type=3D=
"attribution"><blockquote style=3D"margin:0 0 0 .8ex;border-left:1px #ccc s=
olid;padding-left:1ex"><div dir=3D"ltr"><div></div></div></blockquote></div=
></div><div dir=3D"auto"><div class=3D"gmail_quote"><blockquote style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"lt=
r"><div><br></div><div>3) It introduces variables that aren't actually =
used. After all, the `// use` part doesn't care about `src_p` and `dst_=
p`. It will never modify those variables; it only uses what they point to.<=
/div></div></blockquote></div></div><div dir=3D"auto"><br></div><div dir=3D=
"auto">That's an assumption. For the specific 2d image iteration it ver=
y well might be the case but there are situations in data processing in whi=
ch it is not. For example, operations/observations on local windows of data=
.. This is not uncommon.</div><div dir=3D"auto"><br></div><div dir=3D"auto">=
For me, any "solution" which removes my access to a range of N el=
ements before the one explicitly pointed to by the loop iterator is useless=
..</div><div dir=3D"auto"><br></div><div dir=3D"auto">for(</div><div dir=3D"=
auto">=C2=A0 =C2=A0 auto s_first =3D cbegin(source),</div><div dir=3D"auto"=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s_last =3D s_first + N,</d=
iv><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0dest =
=3D begin(destination);</div><div dir=3D"auto">=C2=A0 =C2=A0 s_last !=3D ce=
nd(source);</div><div dir=3D"auto">=C2=A0 =C2=A0 ++s_first, ++s_last, ++des=
t</div><div dir=3D"auto">){</div><div dir=3D"auto">=C2=A0 =C2=A0 dest->s=
ome_op(s_first, s_last);</div><div dir=3D"auto">}</div></div></blockquote><=
div><br></div><div>I would prefer it to look like:<br><div style=3D"backgro=
und-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187); border-sty=
le: solid; border-width: 1px; overflow-wrap: break-word;" class=3D"prettypr=
int"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span style=
=3D"color: #008;" class=3D"styled-by-prettify">for</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #660;=
" class=3D"styled-by-prettify">(</span><span style=3D"color: #008;" class=
=3D"styled-by-prettify">auto</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">&</span><span style=3D"color: #000;" class=3D"styled-=
by-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-pretti=
fy">[</span><span style=3D"color: #000;" class=3D"styled-by-prettify">range=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> dest</span><span s=
tyle=3D"color: #660;" class=3D"styled-by-prettify">]</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #66=
0;" class=3D"styled-by-prettify">:</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> zip</span><span style=3D"color: #660;" class=3D"st=
yled-by-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify">range_window</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">(</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
">source</span><span style=3D"color: #660;" class=3D"styled-by-prettify">,<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"> N</span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">),</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"> destination</span><span st=
yle=3D"color: #660;" class=3D"styled-by-prettify">))</span><span style=3D"c=
olor: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">{</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"><br>=C2=A0 =C2=A0dest</span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">.</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify">some_op</span><span style=3D"color: #660;" cla=
ss=3D"styled-by-prettify">(</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify">range</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">.</span><span style=3D"color: #008;" class=3D"styled-by-prettif=
y">begin</span><span style=3D"color: #660;" class=3D"styled-by-prettify">()=
,</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> range</s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">.</span><span=
style=3D"color: #008;" class=3D"styled-by-prettify">end</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">());</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"><br></span><span style=3D"color: #=
660;" class=3D"styled-by-prettify">}</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"><br></span></div></code></div><br> <br></div></di=
v>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/f63c9a39-a57f-4f2c-8ed5-e77f041ff67c%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/f63c9a39-a57f-4f2c-8ed5-e77f041ff67c=
%40isocpp.org</a>.<br />
------=_Part_6931_1253375822.1515421267066--
------=_Part_6930_1385128113.1515421267066--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Mon, 8 Jan 2018 15:39:52 +0000
Raw View
--001a113d2b780a4f230562459c7d
Content-Type: text/plain; charset="UTF-8"
On 8 Jan 2018 14:21, <inkwizytoryankes@gmail.com> wrote:
On Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrote:
>
> for(
> auto s_first = cbegin(source),
> s_last = s_first + N,
> dest = begin(destination);
> s_last != cend(source);
> ++s_first, ++s_last, ++dest
> ){
> dest->some_op(s_first, s_last);
> }
>
I would prefer it to look like:
for (auto& [range, dest] : zip(range_window(source, N), destination))
{
dest.some_op(range.begin(), range.end());
}
That makes sense in this situation. My concern is that there are arbitrary
operations with pointers and wrapping them in functions isn't always the
preferable solution. The general solution is:
{
initialize
while(condition){
body
increment
}
}
And this is exactly how
for(initialize; condition; increment){
body
}
is defined, except that we are limited to one statement for "initialize".
Making that one statement a bit more powerful in a way which breaks no old
code, and is just as easy to read, is a benefit. Sure we can come up with
an entire zoo of handy views and sub-functions to get this same
functionality, but I wouldn't always call that preferable.
--
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/CAC%2B0CCPSw-HJewUbR9Py_2qmU2xgq-3vCU9pciiPTNQucomWEw%40mail.gmail.com.
--001a113d2b780a4f230562459c7d
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto"><br><div class=3D"gmail_extra" dir=3D"auto"><br><div clas=
s=3D"gmail_quote">On 8 Jan 2018 14:21, <<a href=3D"mailto:inkwizytoryan=
kes@gmail.com">inkwizytoryankes@gmail.com</a>> wrote:<br type=3D"attribu=
tion"><blockquote class=3D"quote" style=3D"margin:0 0 0 .8ex;border-left:1p=
x #ccc solid;padding-left:1ex"><div dir=3D"ltr"><br><br>On Monday, January =
8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrote:<div class=3D"elided-te=
xt"><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"auto"><br><div dir=
=3D"auto"></div><div dir=3D"auto">for(<br></div><div dir=3D"auto">=C2=A0 =
=C2=A0 auto s_first =3D cbegin(source),</div><div dir=3D"auto">=C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s_last =3D s_first + N,</div><div dir=
=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0dest =3D begin(de=
stination);</div><div dir=3D"auto">=C2=A0 =C2=A0 s_last !=3D cend(source);<=
/div><div dir=3D"auto">=C2=A0 =C2=A0 ++s_first, ++s_last, ++dest</div><div =
dir=3D"auto">){</div><div dir=3D"auto">=C2=A0 =C2=A0 dest->some_op(s_fir=
st, s_last);</div><div dir=3D"auto">}</div></div></blockquote><div><br></di=
v></div><div>I would prefer it to look like:<br><div style=3D"background-co=
lor:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;borde=
r-width:1px" class=3D"m_2097020166902175272prettyprint"><code class=3D"m_20=
97020166902175272prettyprint"><div class=3D"m_2097020166902175272subprettyp=
rint"><span style=3D"color:#008" class=3D"m_2097020166902175272styled-by-pr=
ettify">for</span><span style=3D"color:#000" class=3D"m_2097020166902175272=
styled-by-prettify"> </span><span style=3D"color:#660" class=3D"m_209702016=
6902175272styled-by-prettify">(</span><span style=3D"color:#008" class=3D"m=
_2097020166902175272styled-by-prettify">auto</span><span style=3D"color:#66=
0" class=3D"m_2097020166902175272styled-by-prettify">&</span><span styl=
e=3D"color:#000" class=3D"m_2097020166902175272styled-by-prettify"> </span>=
<span style=3D"color:#660" class=3D"m_2097020166902175272styled-by-prettify=
">[</span><span style=3D"color:#000" class=3D"m_2097020166902175272styled-b=
y-prettify">range</span><span style=3D"color:#660" class=3D"m_2097020166902=
175272styled-by-prettify">,</span><span style=3D"color:#000" class=3D"m_209=
7020166902175272styled-by-prettify"> dest</span><span style=3D"color:#660" =
class=3D"m_2097020166902175272styled-by-prettify">]</span><span style=3D"co=
lor:#000" class=3D"m_2097020166902175272styled-by-prettify"> </span><span s=
tyle=3D"color:#660" class=3D"m_2097020166902175272styled-by-prettify">:</sp=
an><span style=3D"color:#000" class=3D"m_2097020166902175272styled-by-prett=
ify"> zip</span><span style=3D"color:#660" class=3D"m_2097020166902175272st=
yled-by-prettify">(</span><span style=3D"color:#000" class=3D"m_20970201669=
02175272styled-by-prettify">range_window</span><span style=3D"color:#660" c=
lass=3D"m_2097020166902175272styled-by-prettify">(</span><span style=3D"col=
or:#000" class=3D"m_2097020166902175272styled-by-prettify">source</span><sp=
an style=3D"color:#660" class=3D"m_2097020166902175272styled-by-prettify">,=
</span><span style=3D"color:#000" class=3D"m_2097020166902175272styled-by-p=
rettify"> N</span><span style=3D"color:#660" class=3D"m_2097020166902175272=
styled-by-prettify">),</span><span style=3D"color:#000" class=3D"m_20970201=
66902175272styled-by-prettify"> destination</span><span style=3D"color:#660=
" class=3D"m_2097020166902175272styled-by-prettify">))</span><span style=3D=
"color:#000" class=3D"m_2097020166902175272styled-by-prettify"><br></span><=
span style=3D"color:#660" class=3D"m_2097020166902175272styled-by-prettify"=
>{</span><span style=3D"color:#000" class=3D"m_2097020166902175272styled-by=
-prettify"><br>=C2=A0 =C2=A0dest</span><span style=3D"color:#660" class=3D"=
m_2097020166902175272styled-by-prettify">.</span><span style=3D"color:#000"=
class=3D"m_2097020166902175272styled-by-prettify">some_op</span><span styl=
e=3D"color:#660" class=3D"m_2097020166902175272styled-by-prettify">(</span>=
<span style=3D"color:#000" class=3D"m_2097020166902175272styled-by-prettify=
">range</span><span style=3D"color:#660" class=3D"m_2097020166902175272styl=
ed-by-prettify">.</span><span style=3D"color:#008" class=3D"m_2097020166902=
175272styled-by-prettify">begin</span><span style=3D"color:#660" class=3D"m=
_2097020166902175272styled-by-prettify">(),</span><span style=3D"color:#000=
" class=3D"m_2097020166902175272styled-by-prettify"> range</span><span styl=
e=3D"color:#660" class=3D"m_2097020166902175272styled-by-prettify">.</span>=
<span style=3D"color:#008" class=3D"m_2097020166902175272styled-by-prettify=
">end</span><span style=3D"color:#660" class=3D"m_2097020166902175272styled=
-by-prettify">());</span><span style=3D"color:#000" class=3D"m_209702016690=
2175272styled-by-prettify"><br></span><span style=3D"color:#660" class=3D"m=
_2097020166902175272styled-by-prettify">}</span><span style=3D"color:#000" =
class=3D"m_2097020166902175272styled-by-prettify"><br></span></div></code><=
/div></div></div></blockquote></div></div><div class=3D"gmail_extra" dir=3D=
"auto"><div class=3D"gmail_quote"><blockquote class=3D"quote" style=3D"marg=
in:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"=
><div></div></div></blockquote></div></div><div class=3D"gmail_extra" dir=
=3D"auto"><div class=3D"gmail_quote"><blockquote class=3D"quote" style=3D"m=
argin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"l=
tr"></div></blockquote></div></div><div class=3D"gmail_extra" dir=3D"auto">=
<div class=3D"gmail_quote"><blockquote class=3D"quote" style=3D"margin:0 0 =
0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"></div>=
</blockquote></div></div><div dir=3D"auto"><br></div><div dir=3D"auto"><br>=
</div><div dir=3D"auto">That makes sense in this situation. My concern is t=
hat there are arbitrary operations with pointers and wrapping them in funct=
ions isn't always the preferable solution. The general solution is:</di=
v><div dir=3D"auto"><br></div><div dir=3D"auto">{</div><div dir=3D"auto">=
=C2=A0 =C2=A0 =C2=A0initialize</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0w=
hile(condition){</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
body</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 increment</d=
iv><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0}</div><div dir=3D"auto">}</div><d=
iv dir=3D"auto"><br></div><div dir=3D"auto">And this is exactly how</div><d=
iv dir=3D"auto"><br></div><div dir=3D"auto">for(initialize; condition; incr=
ement){</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0body</div><div dir=3D"au=
to">}</div><div dir=3D"auto"><br></div><div dir=3D"auto">is defined, except=
that we are limited to one statement for "initialize". Making th=
at one statement a bit more powerful in a way which breaks no old code, and=
is just as easy to read, is a benefit. Sure we can come up with an entire =
zoo of handy views and sub-functions to get this same functionality, but I =
wouldn't always call that preferable.</div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCPSw-HJewUbR9Py_2qmU2xgq-3vCU=
9pciiPTNQucomWEw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">h=
ttps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCPSw-HJ=
ewUbR9Py_2qmU2xgq-3vCU9pciiPTNQucomWEw%40mail.gmail.com</a>.<br />
--001a113d2b780a4f230562459c7d--
.
Author: mihailnajdenov@gmail.com
Date: Mon, 8 Jan 2018 08:07:48 -0800 (PST)
Raw View
------=_Part_15223_68423134.1515427668884
Content-Type: multipart/alternative;
boundary="----=_Part_15224_434639312.1515427668885"
------=_Part_15224_434639312.1515427668885
Content-Type: text/plain; charset="UTF-8"
On Monday, January 8, 2018 at 4:21:07 PM UTC+2, Marcin Jaczewski wrote:
>
>
>
> On Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrote:
>>
>>
>>
>> On 8 Jan 2018 05:40, "Nicol Bolas" <jmck...@gmail.com> wrote:
>>
>>
>> 3) It introduces variables that aren't actually used. After all, the `//
>> use` part doesn't care about `src_p` and `dst_p`. It will never modify
>> those variables; it only uses what they point to.
>>
>>
>> That's an assumption. For the specific 2d image iteration it very well
>> might be the case but there are situations in data processing in which it
>> is not. For example, operations/observations on local windows of data. This
>> is not uncommon.
>>
>> For me, any "solution" which removes my access to a range of N elements
>> before the one explicitly pointed to by the loop iterator is useless.
>>
>> for(
>> auto s_first = cbegin(source),
>> s_last = s_first + N,
>> dest = begin(destination);
>> s_last != cend(source);
>> ++s_first, ++s_last, ++dest
>> ){
>> dest->some_op(s_first, s_last);
>> }
>>
>
> I would prefer it to look like:
> for (auto& [range, dest] : zip(range_window(source, N), destination))
> {
> dest.some_op(range.begin(), range.end());
> }
>
>
Ironically examples like this only prove the need for multiple variables
declaration - range and dest are two variables, both of different type.
Sure it is better written that way, but can it be *always* written like
that? Nicol Bolas will say Yes, but I doubt.
Sometimes there might be a need for more control over the variables (or the
iteration), sometimes it might cumbersome to wrap everything in pretty
range interfaces.
Manual variable initialization will always have its place.
Also, the more we write code like this (which by itself is great) the more
people will *associate* structured bindings with multiple variables and
write code like
for(auto [a, b, c] = std::make_tuple(A(), B(), C()); ...)
*We need a better tool than that, when (not if) people want to write code
like that. *
But, as I said, it is not just for. Other use case are bound to come:
if(auto lock = std::lock_guard(mtx)
, queue = getQueue();
!queue.empty())
{
// use queue
}
if(auto a = weakA.lock()
, b = weakB.lock();
a && b)
{
// use a and b
}
These are pretty reasonable.
Sooner or later the one variable or the multiple with the same type
limitation will be too limiting, simply because* it does not have any
semantic sense*.
*Then* people will just start using hacks.
--
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/c19c0ef8-e61c-4823-9b88-9f08812977f1%40isocpp.org.
------=_Part_15224_434639312.1515427668885
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br style=3D"background-attachment: scroll; background-cli=
p: border-box; background-color: transparent; background-image: none; backg=
round-origin: padding-box; background-position-x: 0%; background-position-y=
: 0%; background-repeat: repeat; background-size: auto; border-bottom-color=
: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bor=
der-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%=
; border-image-source: none; border-image-width: 1; border-left-color: rgb(=
34, 34, 34); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width=
: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&=
quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal; f=
ont-variant: normal; font-weight: 400; height: auto; letter-spacing: normal=
; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px;=
min-width: 0px; orphans: 2; overflow: visible; overflow-x: visible; overfl=
ow-y: visible; padding-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: normal=
; word-spacing: 0px;"><br style=3D"background-attachment: scroll; backgroun=
d-clip: border-box; background-color: transparent; background-image: none; =
background-origin: padding-box; background-position-x: 0%; background-posit=
ion-y: 0%; background-repeat: repeat; background-size: auto; border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; 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(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,=
&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: norm=
al; font-variant: normal; font-weight: 400; height: auto; letter-spacing: n=
ormal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
0px; min-width: 0px; orphans: 2; overflow: visible; overflow-x: visible; o=
verflow-y: visible; padding-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: n=
ormal; word-spacing: 0px;"><span style=3D"display: inline !important; float=
: none; background-color: transparent; color: rgb(34, 34, 34); font-family:=
"Arial","Helvetica",sans-serif; font-size: 13px; font-=
style: normal; font-variant: normal; font-weight: 400; letter-spacing: norm=
al; 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;">On Monday, January 8, 2018 at 4:21:07 PM UTC+2, Marcin =
Jaczewski wrote:</span><blockquote class=3D"gmail_quote" style=3D"backgroun=
d-color: transparent; border-left-color: rgb(204, 204, 204); border-left-st=
yle: solid; border-left-width: 1px; color: rgb(34, 34, 34); font-family: &a=
mp;quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size=
: 13px; font-style: normal; font-variant: normal; font-weight: 400; letter-=
spacing: normal; margin-bottom: 0px; margin-left: 5.38px; margin-right: 0px=
; margin-top: 0px; orphans: 2; padding-left: 6.73px; text-align: left; text=
-decoration: none; text-indent: 0px; text-transform: none; -webkit-text-str=
oke-width: 0px; white-space: normal; word-spacing: 0px;"><div style=3D"bord=
er-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-=
width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-im=
age-slice: 100%; border-image-source: none; border-image-width: 1; border-l=
eft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px=
; border-right-color: rgb(34, 34, 34); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; b=
order-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right:=
0px; padding-top: 0px;" dir=3D"ltr"><br style=3D"background-attachment: sc=
roll; background-clip: border-box; background-color: transparent; backgroun=
d-image: none; background-origin: padding-box; background-position-x: 0%; b=
ackground-position-y: 0%; background-repeat: repeat; background-size: auto;=
border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bo=
ttom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bord=
er-image-slice: 100%; border-image-source: none; border-image-width: 1; bor=
der-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width=
: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; borde=
r-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: no=
ne; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &quot;A=
rial&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; h=
eight: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margi=
n-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible; overflo=
w-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px;"><br style=3D"background-attachment: scroll; background-cl=
ip: border-box; background-color: transparent; background-image: none; back=
ground-origin: padding-box; background-position-x: 0%; background-position-=
y: 0%; background-repeat: repeat; background-size: auto; border-bottom-colo=
r: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(34, 34, 34); border-left-style: none; border-left-width: 0px; border-right=
-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px;=
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-widt=
h: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&=
;quot;Helvetica&quot;,sans-serif; font-size: 13px; height: auto; margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-wid=
th: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">O=
n Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrote:<bloc=
kquote class=3D"gmail_quote" style=3D"border-left-color: rgb(204, 204, 204)=
; border-left-style: solid; border-left-width: 1px; margin-bottom: 0px; mar=
gin-left: 5.38px; margin-right: 0px; margin-top: 0px; padding-left: 6.73px;=
"><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left:=
0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto"><br style=3D"back=
ground-attachment: scroll; background-clip: border-box; background-color: t=
ransparent; background-image: none; background-origin: padding-box; backgro=
und-position-x: 0%; background-position-y: 0%; background-repeat: repeat; b=
ackground-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-s=
tyle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-=
repeat: stretch; border-image-slice: 100%; border-image-source: none; borde=
r-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: no=
ne; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-rig=
ht-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34);=
border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); fon=
t-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-seri=
f; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflo=
w-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;"><div style=3D"border-bottom-color: r=
gb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(34,=
34, 34); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0=
px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top:=
0px;" dir=3D"auto"><br style=3D"background-attachment: scroll; background-=
clip: border-box; background-color: transparent; background-image: none; ba=
ckground-origin: padding-box; background-position-x: 0%; background-positio=
n-y: 0%; background-repeat: repeat; background-size: auto; border-bottom-co=
lor: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-rig=
ht-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wi=
dth: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&a=
mp;quot;Helvetica&quot;,sans-serif; font-size: 13px; height: auto; marg=
in-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-w=
idth: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
><div class=3D"gmail_quote" style=3D"border-bottom-color: rgb(34, 34, 34); =
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0=
; border-image-repeat: stretch; border-image-slice: 100%; border-image-sour=
ce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, =
34); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-botto=
m: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">On 8 Jan =
2018 05:40, "Nicol Bolas" <<a style=3D"border-bottom-color: rg=
b(17, 85, 204); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(17,=
85, 204); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(17, 85, 204); border-right-style: none; border-right-width: 0px; b=
order-top-color: rgb(17, 85, 204); border-top-style: none; border-top-width=
: 0px; color: rgb(17, 85, 204); cursor: text; margin-bottom: 0px; margin-le=
ft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px; text-decoration: none;" rel=
=3D"nofollow">jmck...@gmail.com</a>> wrote:<br style=3D"background-attac=
hment: scroll; background-clip: border-box; background-color: transparent; =
background-image: none; background-origin: padding-box; background-position=
-x: 0%; background-position-y: 0%; background-repeat: repeat; background-si=
ze: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; =
border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stre=
tch; border-image-slice: 100%; border-image-source: none; border-image-widt=
h: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style: no=
ne; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-=
style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &a=
mp;quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-size=
: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible=
; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;" type=3D"attribution"><blockquote style=3D"border=
-left-color: rgb(204, 204, 204); border-left-style: solid; border-left-widt=
h: 1px; margin-bottom: 0px; margin-left: 5.38px; margin-right: 0px; margin-=
top: 0px; padding-left: 6.73px;"><div style=3D"border-bottom-color: rgb(34,=
34, 34); border-bottom-style: none; 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(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pad=
ding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"=
dir=3D"ltr"><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bot=
tom-style: none; border-bottom-width: 0px; border-image-outset: 0; border-i=
mage-repeat: stretch; border-image-slice: 100%; border-image-source: none; =
border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); borde=
r-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34,=
34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; ma=
rgin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pa=
dding-left: 0px; padding-right: 0px; padding-top: 0px;"></div></div></block=
quote></div></div><div style=3D"border-bottom-color: rgb(34, 34, 34); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(34=
, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0p=
x; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0p=
x; padding-left: 0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto"><=
div class=3D"gmail_quote" style=3D"border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; 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(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom:=
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom:=
0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><blockquote=
style=3D"border-left-color: rgb(204, 204, 204); border-left-style: solid; =
border-left-width: 1px; margin-bottom: 0px; margin-left: 5.38px; margin-rig=
ht: 0px; margin-top: 0px; padding-left: 6.73px;"><div style=3D"border-botto=
m-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0=
px; border-image-outset: 0; border-image-repeat: stretch; border-image-slic=
e: 100%; border-image-source: none; border-image-width: 1; border-left-colo=
r: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(34, 34, 34); border-right-style: none; border-right-width=
: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-to=
p-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; marg=
in-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pa=
dding-top: 0px;" dir=3D"ltr"><div style=3D"border-bottom-color: rgb(34, 34,=
34); border-bottom-style: none; border-bottom-width: 0px; border-image-out=
set: 0; border-image-repeat: stretch; border-image-slice: 100%; border-imag=
e-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); =
border-left-style: none; border-left-width: 0px; border-right-color: rgb(34=
, 34, 34); border-right-style: none; border-right-width: 0px; border-top-co=
lor: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin=
-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding=
-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br=
style=3D"background-attachment: scroll; background-clip: border-box; backg=
round-color: transparent; background-image: none; background-origin: paddin=
g-box; background-position-x: 0%; background-position-y: 0%; background-rep=
eat: repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 3=
4); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34=
, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&q=
uot;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: vi=
sible; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;"></div><div style=3D"bo=
rder-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-botto=
m-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(34, 34, 34); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none;=
border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right:=
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;">3) It introduces variables that aren't actua=
lly used. After all, the `// use` part doesn't care about `src_p` and `=
dst_p`. It will never modify those variables; it only uses what they point =
to.</div></div></blockquote></div></div><div style=3D"border-bottom-color: =
rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; borde=
r-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; =
border-image-source: none; border-image-width: 1; border-left-color: rgb(34=
, 34, 34); border-left-style: none; border-left-width: 0px; border-right-co=
lor: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: =
0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0=
px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top=
: 0px;" dir=3D"auto"><br style=3D"background-attachment: scroll; background=
-clip: border-box; background-color: transparent; background-image: none; b=
ackground-origin: padding-box; background-position-x: 0%; background-positi=
on-y: 0%; background-repeat: repeat; background-size: auto; border-bottom-c=
olor: rgb(34, 34, 34); border-bottom-style: none; 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(34, 34, 34); border-left-style: none; border-left-width: 0px; border-ri=
ght-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0=
px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-w=
idth: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&=
amp;quot;Helvetica&quot;,sans-serif; font-size: 13px; height: auto; mar=
gin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-=
width: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; pa=
dding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;=
"></div><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-s=
tyle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-=
repeat: stretch; border-image-slice: 100%; border-image-source: none; borde=
r-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: no=
ne; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-rig=
ht-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34);=
border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-=
left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding=
-left: 0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto">That's =
an assumption. For the specific 2d image iteration it very well might be th=
e case but there are situations in data processing in which it is not. For =
example, operations/observations on local windows of data. This is not unco=
mmon.</div><div style=3D"border-bottom-color: rgb(34, 34, 34); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style:=
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-=
right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 3=
4); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; marg=
in-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padd=
ing-left: 0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto"><br styl=
e=3D"background-attachment: scroll; background-clip: border-box; background=
-color: transparent; background-image: none; background-origin: padding-box=
; background-position-x: 0%; background-position-y: 0%; background-repeat: =
repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34,=
34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,=
sans-serif; font-size: 13px; height: auto; margin-bottom: 0px; margin-left:=
0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible=
; overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;"></div><div style=3D"border-=
bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wid=
th: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(34, 34, 34); border-right-style: none; border-right-=
width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bord=
er-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px;" dir=3D"auto">For me, any "solution" which r=
emoves my access to a range of N elements before the one explicitly pointed=
to by the loop iterator is useless.</div><div style=3D"border-bottom-color=
: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bor=
der-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%=
; border-image-source: none; border-image-width: 1; border-left-color: rgb(=
34, 34, 34); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width=
: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px;" dir=3D"auto"><br style=3D"background-attachment: scroll; backgrou=
nd-clip: border-box; background-color: transparent; background-image: none;=
background-origin: padding-box; background-position-x: 0%; background-posi=
tion-y: 0%; background-repeat: repeat; background-size: auto; border-bottom=
-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0p=
x; border-image-outset: 0; border-image-repeat: stretch; border-image-slice=
: 100%; border-image-source: none; border-image-width: 1; border-left-color=
: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; border-=
right-color: rgb(34, 34, 34); border-right-style: none; border-right-width:=
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top=
-width: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;=
,&quot;Helvetica&quot;,sans-serif; font-size: 13px; height: auto; m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; mi=
n-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x;"></div><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom=
-style: none; border-bottom-width: 0px; border-image-outset: 0; border-imag=
e-repeat: stretch; border-image-slice: 100%; border-image-source: none; bor=
der-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: =
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34=
); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto">for(</div=
><div style=3D"border-bottom-color: rgb(34, 34, 34); 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(34, 34, 34); border-left-style: none; bor=
der-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-styl=
e: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border=
-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0=
px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto">=C2=A0 =C2=A0 auto=
s_first =3D cbegin(source),</div><div style=3D"border-bottom-color: rgb(34=
, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-imag=
e-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border=
-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34, =
34); border-left-style: none; border-left-width: 0px; border-right-color: r=
gb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-t=
op-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pa=
dding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;=
" dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s_last =3D s=
_first + N,</div><div style=3D"border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px=
; padding-left: 0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto">=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0dest =3D begin(destination)=
;</div><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-st=
yle: none; border-bottom-width: 0px; border-image-outset: 0; border-image-r=
epeat: stretch; border-image-slice: 100%; border-image-source: none; border=
-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: non=
e; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-righ=
t-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); =
border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto">=C2=A0 =C2=
=A0 s_last !=3D cend(source);</div><div style=3D"border-bottom-color: rgb(3=
4, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-image-source: none; border-image-width: 1; border-left-color: rgb(34, 34,=
34); border-left-style: none; border-left-width: 0px; border-right-color: =
rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; =
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;" dir=3D"auto">=C2=A0 =C2=A0 ++s_first, ++s_last, ++dest</div><div style=
=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;" dir=3D"auto">){</div><div style=3D"border-=
bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-wid=
th: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(34, 34, 34); border-right-style: none; border-right-=
width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bord=
er-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px;" dir=3D"auto">=C2=A0 =C2=A0 dest->some_op(s_first, =
s_last);</div><div style=3D"border-bottom-color: rgb(34, 34, 34); border-bo=
ttom-style: none; 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(34, 34, 34); border-left-sty=
le: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bord=
er-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34=
, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; p=
adding-left: 0px; padding-right: 0px; padding-top: 0px;" dir=3D"auto">}</di=
v></div></blockquote><div style=3D"border-bottom-color: rgb(34, 34, 34); bo=
rder-bottom-style: none; 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(34, 34, 34); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom:=
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom:=
0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><br style=
=3D"background-attachment: scroll; background-clip: border-box; background-=
color: transparent; background-image: none; background-origin: padding-box;=
background-position-x: 0%; background-position-y: 0%; background-repeat: r=
epeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(34, =
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, =
34); font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,s=
ans-serif; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible;=
overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;"></div><div style=3D"border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; =
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px=
; padding-top: 0px;">I would prefer it to look like:<br style=3D"background=
-attachment: scroll; background-clip: border-box; background-color: transpa=
rent; background-image: none; background-origin: padding-box; background-po=
sition-x: 0%; background-position-y: 0%; background-repeat: repeat; backgro=
und-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-style: =
none; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat=
: stretch; border-image-slice: 100%; border-image-source: none; border-imag=
e-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none; bo=
rder-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-sty=
le: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); borde=
r-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-fami=
ly: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; fon=
t-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-ri=
ght: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x: v=
isible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;"><div style=3D"background-color: rgb(250, 2=
50, 250); border-bottom-color: rgb(187, 187, 187); border-bottom-style: sol=
id; border-bottom-width: 1px; border-image-outset: 0; border-image-repeat: =
stretch; border-image-slice: 100%; border-image-source: none; border-image-=
width: 1; border-left-color: rgb(187, 187, 187); border-left-style: solid; =
border-left-width: 1px; border-right-color: rgb(187, 187, 187); border-righ=
t-style: solid; border-right-width: 1px; border-top-color: rgb(187, 187, 18=
7); border-top-style: solid; border-top-width: 1px; margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;"><code style=3D"borde=
r-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px;=
border-right-color: rgb(34, 34, 34); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bo=
rder-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0p=
x; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: =
0px; padding-top: 0px;"><div style=3D"border-bottom-color: rgb(34, 34, 34);=
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: =
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-sou=
rce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); borde=
r-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34,=
34); border-right-style: none; border-right-width: 0px; border-top-color: =
rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; margin-bott=
om: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bott=
om: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"><span st=
yle=3D"border-bottom-color: rgb(0, 0, 136); border-bottom-style: none; bord=
er-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, 136); border-left-style: none; border-left-w=
idth: 0px; border-right-color: rgb(0, 0, 136); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(0, 0, 136); border-top-style: =
none; border-top-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;">for</span><span styl=
e=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-b=
ottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bor=
der-image-slice: 100%; border-image-source: none; border-image-width: 1; bo=
rder-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bord=
er-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0p=
x; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0=
px; padding-right: 0px; padding-top: 0px;"> </span><span style=3D"border-bo=
ttom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-widt=
h: 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(102, 102, 0); border-left-style: none; border-left-width: 0px; b=
order-right-color: rgb(102, 102, 0); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; bo=
rder-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-le=
ft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-l=
eft: 0px; padding-right: 0px; padding-top: 0px;">(</span><span style=3D"bor=
der-bottom-color: rgb(0, 0, 136); border-bottom-style: none; border-bottom-=
width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-im=
age-slice: 100%; border-image-source: none; border-image-width: 1; border-l=
eft-color: rgb(0, 0, 136); border-left-style: none; border-left-width: 0px;=
border-right-color: rgb(0, 0, 136); border-right-style: none; border-right=
-width: 0px; border-top-color: rgb(0, 0, 136); border-top-style: none; bord=
er-top-width: 0px; color: rgb(0, 0, 136); margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left:=
0px; padding-right: 0px; padding-top: 0px;">auto</span><span style=3D"bord=
er-bottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(102, 102, 0); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(102, 102, 0); border-right-style: none; border-=
right-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: non=
e; border-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; marg=
in-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padd=
ing-left: 0px; padding-right: 0px; padding-top: 0px;">&</span><span sty=
le=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-=
bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; bo=
rder-image-slice: 100%; border-image-source: none; border-image-width: 1; b=
order-left-color: rgb(0, 0, 0); border-left-style: none; border-left-width:=
0px; border-right-color: rgb(0, 0, 0); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; bor=
der-top-width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0=
px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;"> </span><span style=3D"border-b=
ottom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-wid=
th: 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(102, 102, 0); border-left-style: none; border-left-width: 0px; =
border-right-color: rgb(102, 102, 0); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; b=
order-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-l=
eft: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-=
left: 0px; padding-right: 0px; padding-top: 0px;">[</span><span style=3D"bo=
rder-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(0, 0, 0); border-right-style: none; border-right-widt=
h: 0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-=
width: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; pad=
ding-right: 0px; padding-top: 0px;">range</span><span style=3D"border-botto=
m-color: rgb(102, 102, 0); 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(102, 102, 0); border-left-style: none; border-left-width: 0px; bord=
er-right-color: rgb(102, 102, 0); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; borde=
r-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left:=
0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left=
: 0px; padding-right: 0px; padding-top: 0px;">,</span><span style=3D"border=
-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(0, 0, 0); border-left-style: none; border-left-width: 0px; border=
-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0=
px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-widt=
h: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-r=
ight: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding=
-right: 0px; padding-top: 0px;"> dest</span><span style=3D"border-bottom-co=
lor: rgb(102, 102, 0); border-bottom-style: none; 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(102, 102, 0); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(102, 102, 0); border-right-style: none; border-right-width:=
0px; border-top-color: rgb(102, 102, 0); border-top-style: none; border-to=
p-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px;">]</span><span style=3D"border-bot=
tom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0p=
x; 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-rig=
ht-color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0=
px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right=
: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-rig=
ht: 0px; padding-top: 0px;"> </span><span style=3D"border-bottom-color: rgb=
(102, 102, 0); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-image-source: none; border-image-width: 1; border-left-color: rgb(102,=
102, 0); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(102, 102, 0); border-right-style: none; border-right-width: 0px; bo=
rder-top-color: rgb(102, 102, 0); border-top-style: none; border-top-width:=
0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin=
-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px;">:</span><span style=3D"border-bottom-colo=
r: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; borde=
r-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: none; border-right-width: 0px; border-t=
op-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; colo=
r: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; m=
argin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px;=
padding-top: 0px;"> zip</span><span style=3D"border-bottom-color: rgb(102,=
102, 0); border-bottom-style: none; 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(102, 102,=
0); border-left-style: none; border-left-width: 0px; border-right-color: r=
gb(102, 102, 0); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0px;=
color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px;">(</span><span style=3D"border-bottom-color: rg=
b(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-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: none; border-right-width: 0px; border-top-co=
lor: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rg=
b(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;">range_window</span><span style=3D"border-bottom-color: rgb(1=
02, 102, 0); border-bottom-style: none; border-bottom-width: 0px; border-im=
age-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bord=
er-image-source: none; border-image-width: 1; border-left-color: rgb(102, 1=
02, 0); border-left-style: none; border-left-width: 0px; border-right-color=
: rgb(102, 102, 0); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0=
px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-r=
ight: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding=
-right: 0px; padding-top: 0px;">(</span><span style=3D"border-bottom-color:=
rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-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: none; border-right-width: 0px; border-top=
-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color:=
rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; mar=
gin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px;">source</span><span style=3D"border-bottom-color: rgb(102,=
102, 0); border-bottom-style: none; 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(102, 102,=
0); border-left-style: none; border-left-width: 0px; border-right-color: r=
gb(102, 102, 0); border-right-style: none; border-right-width: 0px; border-=
top-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0px;=
color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-ri=
ght: 0px; padding-top: 0px;">,</span><span style=3D"border-bottom-color: rg=
b(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; border-ima=
ge-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; borde=
r-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: none; border-right-width: 0px; border-top-co=
lor: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rg=
b(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;"> N</span><span style=3D"border-bottom-color: rgb(102, 102, 0=
); border-bottom-style: none; border-bottom-width: 0px; border-image-outset=
: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-s=
ource: none; border-image-width: 1; border-left-color: rgb(102, 102, 0); bo=
rder-left-style: none; border-left-width: 0px; border-right-color: rgb(102,=
102, 0); border-right-style: none; border-right-width: 0px; border-top-col=
or: rgb(102, 102, 0); border-top-style: none; border-top-width: 0px; color:=
rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px;=
margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0p=
x; padding-top: 0px;">),</span><span style=3D"border-bottom-color: rgb(0, 0=
, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-out=
set: 0; border-image-repeat: stretch; border-image-slice: 100%; border-imag=
e-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); bor=
der-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0,=
0); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0=
, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: =
0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-to=
p: 0px;"> destination</span><span style=3D"border-bottom-color: rgb(102, 10=
2, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-ou=
tset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-ima=
ge-source: none; border-image-width: 1; border-left-color: rgb(102, 102, 0)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
102, 102, 0); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(102, 102, 0); border-top-style: none; border-top-width: 0px; co=
lor: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right=
: 0px; padding-top: 0px;">))</span><span style=3D"border-bottom-color: rgb(=
0, 0, 0); border-bottom-style: none; 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: none; border-right-width: 0px; border-top-colo=
r: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; color: rgb(=
0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddin=
g-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-=
style: none; border-bottom-width: 0px; border-image-outset: 0; border-image=
-repeat: stretch; border-image-slice: 100%; border-image-source: none; bord=
er-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-st=
yle: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-=
top-style: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0p=
x; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0=
px; padding-right: 0px; padding-top: 0px;"></span><span style=3D"border-bot=
tom-color: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(102, 102, 0); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(102, 102, 0); border-right-style: none; border-right-=
width: 0px; border-top-color: rgb(102, 102, 0); border-top-style: none; bor=
der-top-width: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-lef=
t: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px;">{</span><span style=3D"bord=
er-bottom-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-wid=
th: 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; bord=
er-right-color: rgb(0, 0, 0); border-right-style: none; border-right-width:=
0px; border-top-color: rgb(0, 0, 0); border-top-style: none; border-top-wi=
dth: 0px; color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin=
-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, =
0, 0); border-bottom-style: none; border-bottom-width: 0px; border-image-ou=
tset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-ima=
ge-source: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); bo=
rder-left-style: none; border-left-width: 0px; border-right-color: rgb(0, 0=
, 0); border-right-style: none; border-right-width: 0px; border-top-color: =
rgb(0, 0, 0); border-top-style: none; border-top-width: 0px; margin-bottom:=
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom:=
0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0 =C2=
=A0dest</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(10=
2, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102, =
102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;">.</span><span style=3D"border-bottom-color: rgb(0, 0, 0); borde=
r-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bor=
der-image-repeat: stretch; border-image-slice: 100%; border-image-source: n=
one; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-st=
yle: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0)=
; border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); margi=
n-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; paddin=
g-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">so=
me_op</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border-bo=
ttom-style: none; 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(102, 102, 0); border-left-st=
yle: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0); bo=
rder-right-style: none; border-right-width: 0px; border-top-color: rgb(102,=
102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102, 10=
2, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top:=
0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-t=
op: 0px;">(</span><span style=3D"border-bottom-color: rgb(0, 0, 0); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 0); =
border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); margin-=
bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-=
bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">rang=
e</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border-bottom=
-style: none; border-bottom-width: 0px; border-image-outset: 0; border-imag=
e-repeat: stretch; border-image-slice: 100%; border-image-source: none; bor=
der-image-width: 1; border-left-color: rgb(102, 102, 0); border-left-style:=
none; border-left-width: 0px; border-right-color: rgb(102, 102, 0); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(102, 102=
, 0); border-top-style: none; border-top-width: 0px; color: rgb(102, 102, 0=
); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: =
0px;">.</span><span style=3D"border-bottom-color: rgb(0, 0, 136); border-bo=
ttom-style: none; 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, 136); border-left-styl=
e: none; border-left-width: 0px; border-right-color: rgb(0, 0, 136); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, 13=
6); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 136); m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; pa=
dding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;=
">begin</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border-=
bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; borde=
r-image-repeat: stretch; border-image-slice: 100%; border-image-source: non=
e; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(10=
2, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102, =
102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;">(),</span><span style=3D"border-bottom-color: rgb(0, 0, 0); bor=
der-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; b=
order-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); bord=
er-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0, =
0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0); mar=
gin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padd=
ing-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=
range</span><span style=3D"border-bottom-color: rgb(102, 102, 0); border-b=
ottom-style: none; 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(102, 102, 0); border-left-s=
tyle: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(102=
, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(102, 1=
02, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top=
: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-=
top: 0px;">.</span><span style=3D"border-bottom-color: rgb(0, 0, 136); bord=
er-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bo=
rder-image-repeat: stretch; border-image-slice: 100%; border-image-source: =
none; border-image-width: 1; border-left-color: rgb(0, 0, 136); border-left=
-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 136); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(0, =
0, 136); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 13=
6); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0p=
x; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top:=
0px;">end</span><span style=3D"border-bottom-color: rgb(102, 102, 0); bord=
er-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bo=
rder-image-repeat: stretch; border-image-slice: 100%; border-image-source: =
none; border-image-width: 1; border-left-color: rgb(102, 102, 0); border-le=
ft-style: none; border-left-width: 0px; border-right-color: rgb(102, 102, 0=
); border-right-style: none; border-right-width: 0px; border-top-color: rgb=
(102, 102, 0); border-top-style: none; border-top-width: 0px; color: rgb(10=
2, 102, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin=
-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;">());</span><span style=3D"border-bottom-color: rgb(0, 0, 0);=
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: =
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-sou=
rce: none; border-image-width: 1; border-left-color: rgb(0, 0, 0); border-l=
eft-style: none; border-left-width: 0px; border-right-color: rgb(0, 0, 0); =
border-right-style: none; border-right-width: 0px; border-top-color: rgb(0,=
0, 0); border-top-style: none; border-top-width: 0px; color: rgb(0, 0, 0);=
margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; =
padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0p=
x;"><br style=3D"border-bottom-color: rgb(0, 0, 0); border-bottom-style: no=
ne; 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: none=
; border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style=
: none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin=
-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddi=
ng-right: 0px; padding-top: 0px;"></span><span style=3D"border-bottom-color=
: rgb(102, 102, 0); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(102, 102, 0); border-left-style: none; border-left-width: 0px; border-righ=
t-color: rgb(102, 102, 0); border-right-style: none; border-right-width: 0p=
x; border-top-color: rgb(102, 102, 0); border-top-style: none; border-top-w=
idth: 0px; color: rgb(102, 102, 0); margin-bottom: 0px; margin-left: 0px; m=
argin-right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;">}</span><span style=3D"border-bottom=
-color: rgb(0, 0, 0); border-bottom-style: none; border-bottom-width: 0px; =
border-image-outset: 0; border-image-repeat: stretch; border-image-slice: 1=
00%; border-image-source: none; border-image-width: 1; border-left-color: r=
gb(0, 0, 0); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(0, 0, 0); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(0, 0, 0); border-top-style: none; border-top-width: 0px;=
color: rgb(0, 0, 0); margin-bottom: 0px; margin-left: 0px; margin-right: 0=
px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right:=
0px; padding-top: 0px;"><br style=3D"border-bottom-color: rgb(0, 0, 0); bo=
rder-bottom-style: none; 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); bor=
der-right-style: none; border-right-width: 0px; border-top-color: rgb(0, 0,=
0); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;"></span></div></code>=
</div><br style=3D"background-attachment: scroll; background-clip: border-b=
ox; background-color: transparent; background-image: none; background-origi=
n: padding-box; background-position-x: 0%; background-position-y: 0%; backg=
round-repeat: repeat; background-size: auto; border-bottom-color: rgb(34, 3=
4, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-o=
utset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-im=
age-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
34, 34, 34); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; colo=
r: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvet=
ica&quot;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; ove=
rflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div></div><=
/blockquote><div style=3D"background-color: transparent; border-bottom-colo=
r: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bo=
rder-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100=
%; border-image-source: none; border-image-width: 1; border-left-color: rgb=
(34, 34, 34); border-left-style: none; border-left-width: 0px; border-right=
-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px;=
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-widt=
h: 0px; 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; 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: normal; word-spacing:=
0px;"><br style=3D"background-attachment: scroll; background-clip: border-=
box; background-color: transparent; background-image: none; background-orig=
in: padding-box; background-position-x: 0%; background-position-y: 0%; back=
ground-repeat: repeat; background-size: auto; border-bottom-color: rgb(34, =
34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34=
); border-left-style: none; border-left-width: 0px; border-right-color: rgb=
(34, 34, 34); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; col=
or: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helve=
tica&quot;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0p=
x; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; ov=
erflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom: =
0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div><div s=
tyle=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34)=
; border-bottom-style: none; border-bottom-width: 0px; border-image-outset:=
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-so=
urce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bord=
er-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34=
, 34); border-right-style: none; border-right-width: 0px; border-top-color:=
rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb=
(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&am=
p;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: norm=
al; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-le=
ft: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0p=
x; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align: lef=
t; text-decoration: none; text-indent: 0px; text-transform: none; -webkit-t=
ext-stroke-width: 0px; white-space: normal; word-spacing: 0px;">=C2=A0</div=
><div style=3D"background-color: transparent; border-bottom-color: rgb(34, =
34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34=
); border-left-style: none; border-left-width: 0px; border-right-color: rgb=
(34, 34, 34); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; col=
or: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helve=
tica&quot;,sans-serif; font-size: 13px; font-style: normal; font-varian=
t: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; ma=
rgin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bot=
tom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-ali=
gn: left; text-decoration: none; text-indent: 0px; text-transform: none; -w=
ebkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">Iron=
ically examples like this only prove the need for multiple variables declar=
ation - range and dest are two variables, both of different type.=C2=A0</di=
v><div style=3D"background-color: transparent; border-bottom-color: rgb(34,=
34, 34); border-bottom-style: none; 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(34, 34, 3=
4); border-left-style: none; border-left-width: 0px; border-right-color: rg=
b(34, 34, 34); border-right-style: none; border-right-width: 0px; border-to=
p-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; co=
lor: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helv=
etica&quot;,sans-serif; font-size: 13px; font-style: normal; font-varia=
nt: normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; m=
argin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-bo=
ttom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-al=
ign: left; text-decoration: none; text-indent: 0px; text-transform: none; -=
webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><br=
></div><div style=3D"background-color: transparent; border-bottom-color: rg=
b(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border-=
image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; bo=
rder-image-source: none; border-image-width: 1; border-left-color: rgb(34, =
34, 34); border-left-style: none; border-left-width: 0px; border-right-colo=
r: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bord=
er-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0p=
x; 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; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; paddi=
ng-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; te=
xt-align: left; text-decoration: none; text-indent: 0px; text-transform: no=
ne; -webkit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;=
">Sure it is better written that way, but can it be *always* written like t=
hat? Nicol Bolas will say Yes, but I doubt. </div><div style=3D"background-=
color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-sty=
le: none; border-bottom-width: 0px; border-image-outset: 0; border-image-re=
peat: stretch; border-image-slice: 100%; border-image-source: none; border-=
image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none=
; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right=
-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); b=
order-top-style: none; border-top-width: 0px; 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; margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px; text-align: left; text-decoration:=
none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0=
px; white-space: normal; word-spacing: 0px;">Sometimes there might be a nee=
d for more control over the variables (or the iteration), sometimes it migh=
t cumbersome to wrap everything in pretty range interfaces. </div><div styl=
e=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34); b=
order-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0;=
border-image-repeat: stretch; border-image-slice: 100%; border-image-sourc=
e: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-=
left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 3=
4); border-right-style: none; border-right-width: 0px; border-top-color: rg=
b(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34=
, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&q=
uot;,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-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; -webkit-text=
-stroke-width: 0px; white-space: normal; word-spacing: 0px;">Manual variabl=
e initialization will always have its place.</div><div style=3D"background-=
color: transparent; border-bottom-color: rgb(34, 34, 34); border-bottom-sty=
le: none; border-bottom-width: 0px; border-image-outset: 0; border-image-re=
peat: stretch; border-image-slice: 100%; border-image-source: none; border-=
image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none=
; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right=
-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); b=
order-top-style: none; border-top-width: 0px; 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; margin-bottom: 0px; margin-left: 0px; margin-rig=
ht: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px; text-align: left; text-decoration:=
none; text-indent: 0px; text-transform: none; -webkit-text-stroke-width: 0=
px; white-space: normal; word-spacing: 0px;"><br></div><div style=3D"backgr=
ound-color: transparent; border-bottom-color: rgb(34, 34, 34); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style:=
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-=
right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 3=
4); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); =
font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-s=
erif; font-size: 13px; font-style: normal; font-variant: normal; font-weigh=
t: 400; letter-spacing: normal; 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: normal; word-spacing: 0px;">Also, the more we write c=
ode like this (which by itself is great) the more people will <i>associate<=
/i> structured bindings with multiple variables and write code like </div><=
div style=3D"background-color: transparent; border-bottom-color: rgb(34, 34=
, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-ou=
tset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-ima=
ge-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34);=
border-left-style: none; border-left-width: 0px; border-right-color: rgb(3=
4, 34, 34); border-right-style: none; border-right-width: 0px; border-top-c=
olor: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color=
: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helveti=
ca&quot;,sans-serif; font-size: 13px; font-style: normal; font-variant:=
normal; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; marg=
in-left: 0px; margin-right: 0px; margin-top: 0px; orphans: 2; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px; text-align=
: left; text-decoration: none; text-indent: 0px; text-transform: none; -web=
kit-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><br></=
div><div style=3D"margin: 0px; padding: 0px; border: 0px rgb(34, 34, 34); b=
order-image: none; text-align: left; color: rgb(34, 34, 34); text-transform=
: none; text-indent: 0px; letter-spacing: normal; font-size: 13px; font-var=
iant: normal; word-spacing: 0px; white-space: normal; orphans: 2; -webkit-t=
ext-stroke-width: 0px; background-color: transparent;"><font face=3D"courie=
r new,monospace">for(<span style=3D"text-align: left; color: rgb(34, 34, 34=
); text-transform: none; text-indent: 0px; letter-spacing: normal; font-siz=
e: 13px; font-style: normal; font-variant: normal; font-weight: 400; text-d=
ecoration: none; word-spacing: 0px; display: inline !important; white-space=
: normal; orphans: 2; float: none; -webkit-text-stroke-width: 0px; backgrou=
nd-color: transparent;">auto [a, b, c] =3D std::make_tuple(A()</span><span =
style=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; te=
xt-indent: 0px; letter-spacing: normal; font-size: 13px; font-style: normal=
; font-variant: normal; font-weight: 400; text-decoration: none; word-spaci=
ng: 0px; display: inline !important; white-space: normal; orphans: 2; float=
: none; -webkit-text-stroke-width: 0px; background-color: transparent;">, B=
(), C()); ...)</span></font></div><div style=3D"margin: 0px; padding: 0px; =
border: 0px rgb(34, 34, 34); border-image: none; text-align: left; color: r=
gb(34, 34, 34); text-transform: none; text-indent: 0px; letter-spacing: nor=
mal; font-size: 13px; font-variant: normal; word-spacing: 0px; white-space:=
normal; orphans: 2; -webkit-text-stroke-width: 0px; background-color: tran=
sparent;"><br></div><div style=3D"margin: 0px; padding: 0px; border: 0px rg=
b(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; orpha=
ns: 2; -webkit-text-stroke-width: 0px; background-color: transparent;"><div=
style=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 3=
4); border-bottom-style: none; border-bottom-width: 0px; border-image-outse=
t: 0; border-image-repeat: stretch; border-image-slice: 100%; border-image-=
source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); bo=
rder-left-style: none; border-left-width: 0px; border-right-color: rgb(34, =
34, 34); border-right-style: none; border-right-width: 0px; border-top-colo=
r: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: r=
gb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&=
amp;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: no=
rmal; 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: 0px; padding-top: 0px; text-align: l=
eft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit=
-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;"><span sty=
le=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34); =
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0=
; border-image-repeat: stretch; border-image-slice: 100%; border-image-sour=
ce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border=
-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, =
34); border-right-style: none; border-right-width: 0px; border-top-color: r=
gb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(3=
4, 34, 34); display: inline; float: none; 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; m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; or=
phans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddi=
ng-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; tex=
t-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wor=
d-spacing: 0px;"><font face=3D"arial,sans-serif" style=3D"border-bottom-col=
or: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; b=
order-image-outset: 0; border-image-repeat: stretch; border-image-slice: 10=
0%; border-image-source: none; border-image-width: 1; border-left-color: rg=
b(34, 34, 34); border-left-style: none; border-left-width: 0px; border-righ=
t-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px=
; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wid=
th: 0px; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-to=
p: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding=
-top: 0px;"><i style=3D"border-bottom-color: rgb(34, 34, 34); border-bottom=
-style: none; border-bottom-width: 0px; border-image-outset: 0; border-imag=
e-repeat: stretch; border-image-slice: 100%; border-image-source: none; bor=
der-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: =
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-r=
ight-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34=
); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; margi=
n-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px;">We need a better tool =
than that, when (not if) people want to write code like that.=C2=A0</i></fo=
nt></span></div><b></b><i></i><u></u><sub></sub><sup></sup><strike></strike=
><br></div><div style=3D"background-color: transparent; border-bottom-color=
: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bor=
der-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%=
; border-image-source: none; border-image-width: 1; border-left-color: rgb(=
34, 34, 34); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width=
: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&=
quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: normal; f=
ont-variant: normal; font-weight: 400; letter-spacing: normal; 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: normal; word-spacing: =
0px;"><font face=3D"courier new,monospace"></font><b></b><i></i><u></u><sub=
></sub><sup></sup><strike></strike><br style=3D"background-attachment: scro=
ll; background-clip: border-box; background-color: transparent; background-=
image: none; background-origin: padding-box; background-position-x: 0%; bac=
kground-position-y: 0%; background-repeat: repeat; background-size: auto; b=
order-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bott=
om-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border=
-image-slice: 100%; border-image-source: none; border-image-width: 1; borde=
r-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: =
0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-=
right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none=
; border-top-width: 0px; color: rgb(34, 34, 34); font-family: &quot;Ari=
al&quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; hei=
ght: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-=
top: 0px; min-width: 0px; overflow: visible; overflow-x: visible; overflow-=
y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; pad=
ding-top: 0px;"></div><div style=3D"background-color: transparent; border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; 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; m=
argin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; or=
phans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; paddi=
ng-top: 0px; text-align: left; text-decoration: none; text-indent: 0px; tex=
t-transform: none; -webkit-text-stroke-width: 0px; white-space: normal; wor=
d-spacing: 0px;">But, as I said, it<i> </i>is not just <font face=3D"courie=
r new,monospace" style=3D"border-bottom-color: rgb(34, 34, 34); border-bott=
om-style: none; border-bottom-width: 0px; border-image-outset: 0; border-im=
age-repeat: stretch; border-image-slice: 100%; border-image-source: none; b=
order-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, =
34); border-top-style: none; border-top-width: 0px; margin-bottom: 0px; mar=
gin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0px; pad=
ding-left: 0px; padding-right: 0px; padding-top: 0px;">for. </font><font fa=
ce=3D"arial,sans-serif" style=3D"border-bottom-color: rgb(34, 34, 34); bord=
er-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bo=
rder-image-repeat: stretch; border-image-slice: 100%; border-image-source: =
none; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-lef=
t-style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34);=
border-right-style: none; border-right-width: 0px; border-top-color: rgb(3=
4, 34, 34); border-top-style: none; border-top-width: 0px; margin-bottom: 0=
px; margin-left: 0px; margin-right: 0px; margin-top: 0px; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">Other use cas=
e are bound to come:</font><font face=3D"courier new,monospace" style=3D"bo=
rder-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-botto=
m-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(34, 34, 34); border-left-style: none; border-left-width: 0=
px; border-right-color: rgb(34, 34, 34); border-right-style: none; border-r=
ight-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none;=
border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-right:=
0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-righ=
t: 0px; padding-top: 0px;"><br style=3D"background-attachment: scroll; back=
ground-clip: border-box; background-color: transparent; background-image: n=
one; background-origin: padding-box; background-position-x: 0%; background-=
position-y: 0%; background-repeat: repeat; background-size: auto; border-bo=
ttom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width=
: 0px; border-image-outset: 0; border-image-repeat: stretch; border-image-s=
lice: 100%; border-image-source: none; border-image-width: 1; border-left-c=
olor: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px; bor=
der-right-color: rgb(34, 34, 34); border-right-style: none; border-right-wi=
dth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border=
-top-width: 0px; color: rgb(34, 34, 34); font-family: courier new,monospace=
; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow=
-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; p=
adding-right: 0px; padding-top: 0px;"></font></div><font face=3D"courier ne=
w,monospace" style=3D"background-color: transparent; border-bottom-color: r=
gb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; border=
-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%; b=
order-image-source: none; border-image-width: 1; border-left-color: rgb(34,=
34, 34); border-left-style: none; border-left-width: 0px; border-right-col=
or: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; bor=
der-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0=
px; color: rgb(34, 34, 34); font-family: courier new,monospace; font-size: =
13px; font-style: normal; font-variant: normal; font-weight: 400; letter-sp=
acing: normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; mar=
gin-top: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px; text-align: left; text-decoration: none; text-=
indent: 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-sp=
ace: normal; word-spacing: 0px;"><br style=3D"background-attachment: scroll=
; background-clip: border-box; background-color: transparent; background-im=
age: none; background-origin: padding-box; background-position-x: 0%; backg=
round-position-y: 0%; background-repeat: repeat; background-size: auto; bor=
der-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(34, 34, 34); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; =
border-top-width: 0px; color: rgb(34, 34, 34); font-family: courier new,mon=
ospace; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; ov=
erflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;"> if(auto lock =3D std::lock_gua=
rd(mtx)<br style=3D"background-attachment: scroll; background-clip: border-=
box; background-color: transparent; background-image: none; background-orig=
in: padding-box; background-position-x: 0%; background-position-y: 0%; back=
ground-repeat: repeat; background-size: auto; border-bottom-color: rgb(34, =
34, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-=
outset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-i=
mage-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34=
); border-left-style: none; border-left-width: 0px; border-right-color: rgb=
(34, 34, 34); border-right-style: none; border-right-width: 0px; border-top=
-color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; col=
or: rgb(34, 34, 34); font-family: courier new,monospace; font-size: 13px; h=
eight: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margi=
n-top: 0px; min-width: 0px; overflow: visible; overflow-x: visible; overflo=
w-y: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px;">=C2=A0=C2=A0 , queue =3D getQueue(); <br style=3D"backgro=
und-attachment: scroll; background-clip: border-box; background-color: tran=
sparent; background-image: none; background-origin: padding-box; background=
-position-x: 0%; background-position-y: 0%; background-repeat: repeat; back=
ground-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-styl=
e: none; border-bottom-width: 0px; border-image-outset: 0; border-image-rep=
eat: stretch; border-image-slice: 100%; border-image-source: none; border-i=
mage-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none;=
border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-=
style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); bo=
rder-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-f=
amily: courier new,monospace; font-size: 13px; height: auto; margin-bottom:=
0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px;=
overflow: visible; overflow-x: visible; overflow-y: visible; padding-botto=
m: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0=C2=
=A0 !queue.empty())<br style=3D"background-attachment: scroll; background-c=
lip: border-box; background-color: transparent; background-image: none; bac=
kground-origin: padding-box; background-position-x: 0%; background-position=
-y: 0%; background-repeat: repeat; background-size: auto; border-bottom-col=
or: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; b=
order-image-outset: 0; border-image-repeat: stretch; border-image-slice: 10=
0%; border-image-source: none; border-image-width: 1; border-left-color: rg=
b(34, 34, 34); border-left-style: none; border-left-width: 0px; border-righ=
t-color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px=
; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-wid=
th: 0px; color: rgb(34, 34, 34); font-family: courier new,monospace; font-s=
ize: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-right=
: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x: visi=
ble; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-r=
ight: 0px; padding-top: 0px;">{<br style=3D"background-attachment: scroll; =
background-clip: border-box; background-color: transparent; background-imag=
e: none; background-origin: padding-box; background-position-x: 0%; backgro=
und-position-y: 0%; background-repeat: repeat; background-size: auto; borde=
r-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-w=
idth: 0px; border-image-outset: 0; border-image-repeat: stretch; border-ima=
ge-slice: 100%; border-image-source: none; border-image-width: 1; border-le=
ft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px;=
border-right-color: rgb(34, 34, 34); border-right-style: none; border-righ=
t-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; bo=
rder-top-width: 0px; color: rgb(34, 34, 34); font-family: courier new,monos=
pace; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; =
margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; over=
flow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0p=
x; padding-right: 0px; padding-top: 0px;">=C2=A0=C2=A0 // use queue<br styl=
e=3D"background-attachment: scroll; background-clip: border-box; background=
-color: transparent; background-image: none; background-origin: padding-box=
; background-position-x: 0%; background-position-y: 0%; background-repeat: =
repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34,=
34); font-family: courier new,monospace; font-size: 13px; height: auto; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min=
-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;">}<br style=3D"background-attachment: scroll; background-clip: border-box=
; background-color: transparent; background-image: none; background-origin:=
padding-box; background-position-x: 0%; background-position-y: 0%; backgro=
und-repeat: repeat; background-size: auto; border-bottom-color: rgb(34, 34,=
34); border-bottom-style: none; border-bottom-width: 0px; border-image-out=
set: 0; border-image-repeat: stretch; border-image-slice: 100%; border-imag=
e-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); =
border-left-style: none; border-left-width: 0px; border-right-color: rgb(34=
, 34, 34); border-right-style: none; border-right-width: 0px; border-top-co=
lor: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color:=
rgb(34, 34, 34); font-family: courier new,monospace; font-size: 13px; heig=
ht: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; min-width: 0px; overflow: visible; overflow-x: visible; overflow-y=
: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;"> <br style=3D"background-attachment: scroll; background-cli=
p: border-box; background-color: transparent; background-image: none; backg=
round-origin: padding-box; background-position-x: 0%; background-position-y=
: 0%; background-repeat: repeat; background-size: auto; border-bottom-color=
: rgb(34, 34, 34); border-bottom-style: none; border-bottom-width: 0px; bor=
der-image-outset: 0; border-image-repeat: stretch; border-image-slice: 100%=
; border-image-source: none; border-image-width: 1; border-left-color: rgb(=
34, 34, 34); border-left-style: none; border-left-width: 0px; border-right-=
color: rgb(34, 34, 34); border-right-style: none; border-right-width: 0px; =
border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-width=
: 0px; color: rgb(34, 34, 34); font-family: courier new,monospace; font-siz=
e: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-right: =
0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x: visibl=
e; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-rig=
ht: 0px; padding-top: 0px;"> if(auto a =3D weakA.lock()<br style=3D"backgr=
ound-attachment: scroll; background-clip: border-box; background-color: tra=
nsparent; background-image: none; background-origin: padding-box; backgroun=
d-position-x: 0%; background-position-y: 0%; background-repeat: repeat; bac=
kground-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-sty=
le: none; border-bottom-width: 0px; border-image-outset: 0; border-image-re=
peat: stretch; border-image-slice: 100%; border-image-source: none; border-=
image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style: none=
; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right=
-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); b=
order-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-=
family: courier new,monospace; font-size: 13px; height: auto; margin-bottom=
: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px=
; overflow: visible; overflow-x: visible; overflow-y: visible; padding-bott=
om: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px;">=C2=A0=
=C2=A0 , b =3D weakB.lock();<br style=3D"background-attachment: scroll; bac=
kground-clip: border-box; background-color: transparent; background-image: =
none; background-origin: padding-box; background-position-x: 0%; background=
-position-y: 0%; background-repeat: repeat; background-size: auto; border-b=
ottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-widt=
h: 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(34, 34, 34); border-left-style: none; border-left-width: 0px; bo=
rder-right-color: rgb(34, 34, 34); border-right-style: none; border-right-w=
idth: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; borde=
r-top-width: 0px; color: rgb(34, 34, 34); font-family: courier new,monospac=
e; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; mar=
gin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflo=
w-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; =
padding-right: 0px; padding-top: 0px;">=C2=A0=C2=A0 a && b)<br styl=
e=3D"background-attachment: scroll; background-clip: border-box; background=
-color: transparent; background-image: none; background-origin: padding-box=
; background-position-x: 0%; background-position-y: 0%; background-repeat: =
repeat; background-size: auto; border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
34, 34); border-top-style: none; border-top-width: 0px; color: rgb(34, 34,=
34); font-family: courier new,monospace; font-size: 13px; height: auto; ma=
rgin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px; min=
-width: 0px; overflow: visible; overflow-x: visible; overflow-y: visible; p=
adding-bottom: 0px; padding-left: 0px; padding-right: 0px; padding-top: 0px=
;">{<br style=3D"background-attachment: scroll; background-clip: border-box=
; background-color: transparent; background-image: none; background-origin:=
padding-box; background-position-x: 0%; background-position-y: 0%; backgro=
und-repeat: repeat; background-size: auto; border-bottom-color: rgb(34, 34,=
34); border-bottom-style: none; border-bottom-width: 0px; border-image-out=
set: 0; border-image-repeat: stretch; border-image-slice: 100%; border-imag=
e-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); =
border-left-style: none; border-left-width: 0px; border-right-color: rgb(34=
, 34, 34); border-right-style: none; border-right-width: 0px; border-top-co=
lor: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color:=
rgb(34, 34, 34); font-family: courier new,monospace; font-size: 13px; heig=
ht: auto; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-t=
op: 0px; min-width: 0px; overflow: visible; overflow-x: visible; overflow-y=
: visible; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; padd=
ing-top: 0px;">=C2=A0 // use a and b<br style=3D"background-attachment: scr=
oll; background-clip: border-box; background-color: transparent; background=
-image: none; background-origin: padding-box; background-position-x: 0%; ba=
ckground-position-y: 0%; background-repeat: repeat; background-size: auto; =
border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bot=
tom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; borde=
r-image-slice: 100%; border-image-source: none; border-image-width: 1; bord=
er-left-color: rgb(34, 34, 34); border-left-style: none; border-left-width:=
0px; border-right-color: rgb(34, 34, 34); border-right-style: none; border=
-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: non=
e; border-top-width: 0px; color: rgb(34, 34, 34); font-family: courier new,=
monospace; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: =
0px; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible;=
overflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-lef=
t: 0px; padding-right: 0px; padding-top: 0px;">}</font><div style=3D"backgr=
ound-color: transparent; border-bottom-color: rgb(34, 34, 34); border-botto=
m-style: none; border-bottom-width: 0px; border-image-outset: 0; border-ima=
ge-repeat: stretch; border-image-slice: 100%; border-image-source: none; bo=
rder-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style:=
none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border-=
right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, 3=
4); border-top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); =
font-family: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-s=
erif; font-size: 13px; font-style: normal; font-variant: normal; font-weigh=
t: 400; letter-spacing: normal; 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: normal; word-spacing: 0px;"></div><div style=3D"backg=
round-color: transparent; border-bottom-color: rgb(34, 34, 34); border-bott=
om-style: none; border-bottom-width: 0px; border-image-outset: 0; border-im=
age-repeat: stretch; border-image-slice: 100%; border-image-source: none; b=
order-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-style=
: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); border=
-right-style: none; border-right-width: 0px; border-top-color: rgb(34, 34, =
34); border-top-style: none; border-top-width: 0px; 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-weig=
ht: 400; letter-spacing: normal; margin-bottom: 0px; margin-left: 0px; marg=
in-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; padding-le=
ft: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-decor=
ation: none; text-indent: 0px; text-transform: none; -webkit-text-stroke-wi=
dth: 0px; white-space: normal; word-spacing: 0px;"><b style=3D"background-a=
ttachment: scroll; background-clip: border-box; background-color: transpare=
nt; background-image: none; background-origin: padding-box; background-posi=
tion-x: 0%; background-position-y: 0%; background-repeat: repeat; backgroun=
d-size: auto; border-bottom-color: rgb(34, 34, 34); border-bottom-style: no=
ne; 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(34, 34, 34); border-left-style: none; bord=
er-left-width: 0px; border-right-color: rgb(34, 34, 34); border-right-style=
: none; border-right-width: 0px; border-top-color: rgb(34, 34, 34); border-=
top-style: none; border-top-width: 0px; color: rgb(34, 34, 34); font-family=
: &quot;Arial&quot;,&quot;Helvetica&quot;,sans-serif; font-=
size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px; margin-righ=
t: 0px; margin-top: 0px; min-width: 0px; overflow: visible; overflow-x: vis=
ible; overflow-y: visible; padding-bottom: 0px; padding-left: 0px; padding-=
right: 0px; padding-top: 0px;"><font face=3D"courier new,monospace" style=
=3D"border-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border=
-bottom-width: 0px; border-image-outset: 0; border-image-repeat: stretch; b=
order-image-slice: 100%; border-image-source: none; border-image-width: 1; =
border-left-color: rgb(34, 34, 34); border-left-style: none; border-left-wi=
dth: 0px; border-right-color: rgb(34, 34, 34); border-right-style: none; bo=
rder-right-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style:=
none; border-top-width: 0px; margin-bottom: 0px; margin-left: 0px; margin-=
right: 0px; margin-top: 0px; padding-bottom: 0px; padding-left: 0px; paddin=
g-right: 0px; padding-top: 0px;"><br style=3D"background-attachment: scroll=
; background-clip: border-box; background-color: transparent; background-im=
age: none; background-origin: padding-box; background-position-x: 0%; backg=
round-position-y: 0%; background-repeat: repeat; background-size: auto; bor=
der-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom=
-width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-i=
mage-slice: 100%; border-image-source: none; border-image-width: 1; border-=
left-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0p=
x; border-right-color: rgb(34, 34, 34); border-right-style: none; border-ri=
ght-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; =
border-top-width: 0px; color: rgb(34, 34, 34); font-family: courier new,mon=
ospace; font-size: 13px; height: auto; margin-bottom: 0px; margin-left: 0px=
; margin-right: 0px; margin-top: 0px; min-width: 0px; overflow: visible; ov=
erflow-x: visible; overflow-y: visible; padding-bottom: 0px; padding-left: =
0px; padding-right: 0px; padding-top: 0px;"></font></b></div><div style=3D"=
background-color: transparent; border-bottom-color: rgb(34, 34, 34); border=
-bottom-style: none; border-bottom-width: 0px; border-image-outset: 0; bord=
er-image-repeat: stretch; border-image-slice: 100%; border-image-source: no=
ne; border-image-width: 1; border-left-color: rgb(34, 34, 34); border-left-=
style: none; border-left-width: 0px; border-right-color: rgb(34, 34, 34); b=
order-right-style: none; border-right-width: 0px; border-top-color: rgb(34,=
34, 34); border-top-style: none; border-top-width: 0px; 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; margin-bottom: 0px; margin-left: 0px;=
margin-right: 0px; margin-top: 0px; orphans: 2; padding-bottom: 0px; paddi=
ng-left: 0px; padding-right: 0px; padding-top: 0px; text-align: left; text-=
decoration: none; text-indent: 0px; text-transform: none; -webkit-text-stro=
ke-width: 0px; white-space: normal; word-spacing: 0px;">These are pretty re=
asonable. </div><div style=3D"background-color: transparent; border-bottom-=
color: rgb(34, 34, 34); border-bottom-style: none; 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(34, 34, 34); border-left-style: none; border-left-width: 0px; border-r=
ight-color: rgb(34, 34, 34); border-right-style: none; border-right-width: =
0px; border-top-color: rgb(34, 34, 34); border-top-style: none; border-top-=
width: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,=
&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-style: norm=
al; 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: 0px; padding-top=
: 0px; text-align: left; text-decoration: none; text-indent: 0px; text-tran=
sform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-spac=
ing: 0px;">Sooner or later the one variable or the multiple with the same t=
ype limitation will be too limiting, simply because<i> it does not have any=
semantic sense</i>.</div><div style=3D"background-color: transparent; bord=
er-bottom-color: rgb(34, 34, 34); border-bottom-style: none; border-bottom-=
width: 0px; border-image-outset: 0; border-image-repeat: stretch; border-im=
age-slice: 100%; border-image-source: none; border-image-width: 1; border-l=
eft-color: rgb(34, 34, 34); border-left-style: none; border-left-width: 0px=
; border-right-color: rgb(34, 34, 34); border-right-style: none; border-rig=
ht-width: 0px; border-top-color: rgb(34, 34, 34); border-top-style: none; b=
order-top-width: 0px; color: rgb(34, 34, 34); font-family: &quot;Arial&=
amp;quot;,&quot;Helvetica&quot;,sans-serif; font-size: 13px; font-s=
tyle: normal; font-variant: normal; font-weight: 400; letter-spacing: norma=
l; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top: 0px=
; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0px; p=
adding-top: 0px; text-align: left; text-decoration: none; text-indent: 0px;=
text-transform: none; -webkit-text-stroke-width: 0px; white-space: normal;=
word-spacing: 0px;"><i>Then</i> people will just start using hacks.=C2=A0<=
i></i><br style=3D"background-attachment: scroll; background-clip: border-b=
ox; background-color: transparent; background-image: none; background-origi=
n: padding-box; background-position-x: 0%; background-position-y: 0%; backg=
round-repeat: repeat; background-size: auto; border-bottom-color: rgb(34, 3=
4, 34); border-bottom-style: none; border-bottom-width: 0px; border-image-o=
utset: 0; border-image-repeat: stretch; border-image-slice: 100%; border-im=
age-source: none; border-image-width: 1; border-left-color: rgb(34, 34, 34)=
; border-left-style: none; border-left-width: 0px; border-right-color: rgb(=
34, 34, 34); border-right-style: none; border-right-width: 0px; border-top-=
color: rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; colo=
r: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvet=
ica&quot;,sans-serif; font-size: 13px; height: auto; margin-bottom: 0px=
; margin-left: 0px; margin-right: 0px; margin-top: 0px; min-width: 0px; ove=
rflow: visible; overflow-x: visible; overflow-y: visible; padding-bottom: 0=
px; padding-left: 0px; padding-right: 0px; padding-top: 0px;"></div><div st=
yle=3D"background-color: transparent; border-bottom-color: rgb(34, 34, 34);=
border-bottom-style: none; border-bottom-width: 0px; border-image-outset: =
0; border-image-repeat: stretch; border-image-slice: 100%; border-image-sou=
rce: none; border-image-width: 1; border-left-color: rgb(34, 34, 34); borde=
r-left-style: none; border-left-width: 0px; border-right-color: rgb(34, 34,=
34); border-right-style: none; border-right-width: 0px; border-top-color: =
rgb(34, 34, 34); border-top-style: none; border-top-width: 0px; color: rgb(=
34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helvetica&=
;quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: norma=
l; font-weight: 400; letter-spacing: normal; margin-bottom: 0px; margin-lef=
t: 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; -webkit-te=
xt-stroke-width: 0px; white-space: normal; word-spacing: 0px;">=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" 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/c19c0ef8-e61c-4823-9b88-9f08812977f1%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/c19c0ef8-e61c-4823-9b88-9f08812977f1=
%40isocpp.org</a>.<br />
------=_Part_15224_434639312.1515427668885--
------=_Part_15223_68423134.1515427668884--
.
Author: mihailnajdenov@gmail.com
Date: Mon, 8 Jan 2018 08:20:22 -0800 (PST)
Raw View
------=_Part_8283_1542857004.1515428422813
Content-Type: multipart/alternative;
boundary="----=_Part_8284_160611368.1515428422813"
------=_Part_8284_160611368.1515428422813
Content-Type: text/plain; charset="UTF-8"
On Monday, January 8, 2018 at 4:21:07 PM UTC+2, Marcin Jaczewski wrote:
>
>
>
> On Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrote:
>>
>>
>>
>> On 8 Jan 2018 05:40, "Nicol Bolas" <jmck...@gmail.com> wrote:
>>
>>
>> 3) It introduces variables that aren't actually used. After all, the `//
>> use` part doesn't care about `src_p` and `dst_p`. It will never modify
>> those variables; it only uses what they point to.
>>
>>
>> That's an assumption. For the specific 2d image iteration it very well
>> might be the case but there are situations in data processing in which it
>> is not. For example, operations/observations on local windows of data. This
>> is not uncommon.
>>
>> For me, any "solution" which removes my access to a range of N elements
>> before the one explicitly pointed to by the loop iterator is useless.
>>
>> for(
>> auto s_first = cbegin(source),
>> s_last = s_first + N,
>> dest = begin(destination);
>> s_last != cend(source);
>> ++s_first, ++s_last, ++dest
>> ){
>> dest->some_op(s_first, s_last);
>> }
>>
>
> I would prefer it to look like:
> for (auto& [range, dest] : zip(range_window(source, N), destination))
> {
> dest.some_op(range.begin(), range.end());
> }
>
>
>
Ironically examples like this only prove the need for multiple variables
declaration - range and dest are two variables, both of different type.
Sure it is better written that way, but can it be *always* written like
that? Nicol Bolas will say Yes, but I doubt.
Sometimes there might be a need for more control over the variables (or the
iteration), sometimes it might cumbersome to wrap everything in pretty
range interfaces.
Manual variable initialization will always have its place.
And as I said, it is not just for. Other use case are bound to come:
if(auto lock = std::lock_guard(mtx)
, queue = getQueue();
!queue.empty())
{
// use queue
}
if(auto a = weakA.lock()
, b = weakB.lock();
a && b)
{
// use a and b
}
These are pretty reasonable.
Sooner or later the one variable or multiple with the same type limitations
will become too limiting, simply because they don't have *any* semantic
sense.
At that point people will just start using hacks (like the tuple one).
--
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/7c5e0a98-5230-4a42-b6ad-9f5495480385%40isocpp.org.
------=_Part_8284_160611368.1515428422813
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Monday, January 8, 2018 at 4:21:07 PM UTC+2, Ma=
rcin Jaczewski wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div dir=
=3D"ltr"><br><br>On Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arki=
nstall 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"auto"><br>=
<div dir=3D"auto"><br><div class=3D"gmail_quote">On 8 Jan 2018 05:40, "=
;Nicol Bolas" <<a rel=3D"nofollow">jmck...@gmail.com</a>> wrote:=
<br type=3D"attribution"><blockquote style=3D"margin:0 0 0 .8ex;border-left=
:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div></div></div></block=
quote></div></div><div dir=3D"auto"><div class=3D"gmail_quote"><blockquote =
style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><di=
v dir=3D"ltr"><div><br></div><div>3) It introduces variables that aren'=
t actually used. After all, the `// use` part doesn't care about `src_p=
` and `dst_p`. It will never modify those variables; it only uses what they=
point to.</div></div></blockquote></div></div><div dir=3D"auto"><br></div>=
<div dir=3D"auto">That's an assumption. For the specific 2d image itera=
tion it very well might be the case but there are situations in data proces=
sing in which it is not. For example, operations/observations on local wind=
ows of data. This is not uncommon.</div><div dir=3D"auto"><br></div><div di=
r=3D"auto">For me, any "solution" which removes my access to a ra=
nge of N elements before the one explicitly pointed to by the loop iterator=
is useless.</div><div dir=3D"auto"><br></div><div dir=3D"auto">for(</div><=
div dir=3D"auto">=C2=A0 =C2=A0 auto s_first =3D cbegin(source),</div><div d=
ir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s_last =3D s_fi=
rst + N,</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
=C2=A0dest =3D begin(destination);</div><div dir=3D"auto">=C2=A0 =C2=A0 s_l=
ast !=3D cend(source);</div><div dir=3D"auto">=C2=A0 =C2=A0 ++s_first, ++s_=
last, ++dest</div><div dir=3D"auto">){</div><div dir=3D"auto">=C2=A0 =C2=A0=
dest->some_op(s_first, s_last);</div><div dir=3D"auto">}</div></div></b=
lockquote><div><br></div><div>I would prefer it to look like:<br><div style=
=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-=
style:solid;border-width:1px"><code><div><span style=3D"color:#008">for</sp=
an><span style=3D"color:#000"> </span><span style=3D"color:#660">(</span><s=
pan style=3D"color:#008">auto</span><span style=3D"color:#660">&</span>=
<span style=3D"color:#000"> </span><span style=3D"color:#660">[</span><span=
style=3D"color:#000">range</span><span style=3D"color:#660">,</span><span =
style=3D"color:#000"> dest</span><span style=3D"color:#660">]</span><span s=
tyle=3D"color:#000"> </span><span style=3D"color:#660">:</span><span style=
=3D"color:#000"> zip</span><span style=3D"color:#660">(</span><span style=
=3D"color:#000">range_window</span><span style=3D"color:#660">(</span><span=
style=3D"color:#000">source</span><span style=3D"color:#660">,</span><span=
style=3D"color:#000"> N</span><span style=3D"color:#660">),</span><span st=
yle=3D"color:#000"> destination</span><span style=3D"color:#660">))</span><=
span style=3D"color:#000"><br></span><span style=3D"color:#660">{</span><sp=
an style=3D"color:#000"><br>=C2=A0 =C2=A0dest</span><span style=3D"color:#6=
60">.</span><span style=3D"color:#000">some_op</span><span style=3D"color:#=
660">(</span><span style=3D"color:#000">range</span><span style=3D"color:#6=
60">.</span><span style=3D"color:#008">begin</span><span style=3D"color:#66=
0">(),</span><span style=3D"color:#000"> range</span><span style=3D"color:#=
660">.</span><span style=3D"color:#008">end</span><span style=3D"color:#660=
">());</span><span style=3D"color:#000"><br></span><span style=3D"color:#66=
0">}</span><span style=3D"color:#000"><br></span></div></code></div><br> <b=
r></div></div></blockquote><div><br></div><div>Ironically examples like thi=
s only prove the need for multiple variables declaration - range and dest a=
re two variables, both of different type. </div><div><br></div><div>Sure it=
is better written that way, but can it be *always* written like that? Nico=
l Bolas will say Yes, but I doubt. <br>Sometimes there might be a need for =
more control over the variables (or the iteration), sometimes it might cumb=
ersome to wrap everything in pretty range interfaces. </div><div><br>Manual=
variable initialization will always have its place.</div><div><span style=
=3D"text-align: left; color: rgb(34, 34, 34); text-transform: none; text-in=
dent: 0px; letter-spacing: normal; font-size: 13px; font-variant: normal; f=
ont-weight: 400; text-decoration: none; word-spacing: 0px; display: inline =
!important; white-space: normal; orphans: 2; float: none; -webkit-text-stro=
ke-width: 0px; background-color: transparent;"><br></span></div><div><b><fo=
nt face=3D"arial,sans-serif"><i><br></i></font></b></div><div>And as I said=
, it is not just <font face=3D"courier new,monospace">for</font>. Other use=
case are bound to come:</div><div><br></div><div><font face=3D"courier new=
,monospace">if(auto lock =3D std::lock_guard(mtx)<br>=C2=A0=C2=A0 , queue =
=3D getQueue(); <br>=C2=A0=C2=A0 !queue.empty())<br>{<br>=C2=A0=C2=A0 // us=
e queue</font></div><div><font face=3D"courier new,monospace"> }</font></di=
v><div><font face=3D"courier new"><br></font></div><div><font face=3D"couri=
er new,monospace">if(auto a =3D weakA.lock()<br>=C2=A0=C2=A0 , b =3D weakB.=
lock();<br>=C2=A0=C2=A0 a && b)<br>{<br>=C2=A0 // use a and b<br>}<=
/font></div><div><font face=3D"courier new,monospace"><br></font></div><div=
><font face=3D"arial,sans-serif">These are pretty reasonable. </font></div>=
<div><font face=3D"arial,sans-serif">Sooner or later the one variable or mu=
ltiple with the same type limitations will become too limiting, simply beca=
use they don't have <i>any</i> semantic sense.</font></div><div>At that=
point people will just start using hacks (like the tuple one).</div><div>=
=C2=A0</div><div><br></div><div>=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" 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/7c5e0a98-5230-4a42-b6ad-9f5495480385%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/7c5e0a98-5230-4a42-b6ad-9f5495480385=
%40isocpp.org</a>.<br />
------=_Part_8284_160611368.1515428422813--
------=_Part_8283_1542857004.1515428422813--
.
Author: Marcin Jaczewski <marcinjaczewski86@gmail.com>
Date: Mon, 8 Jan 2018 17:22:03 +0100
Raw View
--94eb2c1b1f2e0a63b50562463468
Content-Type: text/plain; charset="UTF-8"
2018-01-08 16:39 GMT+01:00 Jake Arkinstall <jake.arkinstall@gmail.com>:
>
>
> On 8 Jan 2018 14:21, <inkwizytoryankes@gmail.com> wrote:
>
>
>
> On Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrote:
>
>>
>> for(
>> auto s_first = cbegin(source),
>> s_last = s_first + N,
>> dest = begin(destination);
>> s_last != cend(source);
>> ++s_first, ++s_last, ++dest
>> ){
>> dest->some_op(s_first, s_last);
>> }
>>
>
> I would prefer it to look like:
> for (auto& [range, dest] : zip(range_window(source, N), destination))
> {
> dest.some_op(range.begin(), range.end());
> }
>
>
>
> That makes sense in this situation. My concern is that there are arbitrary
> operations with pointers and wrapping them in functions isn't always the
> preferable solution. The general solution is:
>
> {
> initialize
> while(condition){
> body
> increment
> }
> }
>
> And this is exactly how
>
> for(initialize; condition; increment){
> body
> }
>
> is defined, except that we are limited to one statement for "initialize".
> Making that one statement a bit more powerful in a way which breaks no old
> code, and is just as easy to read, is a benefit. Sure we can come up with
> an entire zoo of handy views and sub-functions to get this same
> functionality, but I wouldn't always call that preferable.
> --
> You received this message because you are subscribed to a topic in the
> Google Groups "ISO C++ Standard - Future Proposals" group.
> To unsubscribe from this topic, visit https://groups.google.com/a/
> isocpp.org/d/topic/std-proposals/lk5oLy6qM7Q/unsubscribe.
> To unsubscribe from this group and all its topics, 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/CAC%2B0CCPSw-HJewUbR9Py_2qmU2xgq-
> 3vCU9pciiPTNQucomWEw%40mail.gmail.com
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCPSw-HJewUbR9Py_2qmU2xgq-3vCU9pciiPTNQucomWEw%40mail.gmail.com?utm_medium=email&utm_source=footer>
> .
>
You are right that view are not silver bullet that will fix all possible
problems and in the and we will need use old `for` for some cases. Question
is how many times you have case that using some standard view or writing
new one (even if it will be use only one time) will be inappropriate?
Exactly where line is in many times depend on taste but overall we could
agree on order of magnitude.
How often you need have to write this loops that can not be replaces by
view? If it will happens very often then indeed this change could improve
overall langue but if is not? Then I will leave this as is.
BTW in `for` the `initialize` is equally powerful as `increment`, you can
assign multiple variables in statement, only problem is that allow only one
declaration statement. In old C this was not problem because it was
forbidden to declare variables in the middle of function.
--
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/CACZhb08H8yKSYW5yNoDVN5fzm6T9UxUJkPaxC1GB_gNXijrytg%40mail.gmail.com.
--94eb2c1b1f2e0a63b50562463468
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><div class=3D"gmail_extra"><br><div class=3D"gmail_quo=
te">2018-01-08 16:39 GMT+01:00 Jake Arkinstall <span dir=3D"ltr"><<a hre=
f=3D"mailto:jake.arkinstall@gmail.com" target=3D"_blank">jake.arkinstall@gm=
ail.com</a>></span>:<br><blockquote class=3D"gmail_quote" style=3D"margi=
n:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex=
"><div dir=3D"auto"><br><div class=3D"gmail_extra" dir=3D"auto"><br><div cl=
ass=3D"gmail_quote"><span class=3D"gmail-">On 8 Jan 2018 14:21, <<a hre=
f=3D"mailto:inkwizytoryankes@gmail.com" target=3D"_blank">inkwizytoryankes@=
gmail.com</a>> wrote:<br type=3D"attribution"></span><blockquote class=
=3D"gmail-m_-7361981778010919460quote" style=3D"margin:0px 0px 0px 0.8ex;bo=
rder-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir=3D"ltr"><sp=
an class=3D"gmail-"><br><br>On Monday, January 8, 2018 at 10:01:53 AM UTC+1=
, Jake Arkinstall wrote:</span><span class=3D"gmail-"><div class=3D"gmail-m=
_-7361981778010919460elided-text"><blockquote class=3D"gmail_quote" style=
=3D"margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding=
-left:1ex"><div dir=3D"auto"><br><div dir=3D"auto">for(<br></div><div dir=
=3D"auto">=C2=A0 =C2=A0 auto s_first =3D cbegin(source),</div><div dir=3D"a=
uto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s_last =3D s_first + N=
,</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0de=
st =3D begin(destination);</div><div dir=3D"auto">=C2=A0 =C2=A0 s_last !=3D=
cend(source);</div><div dir=3D"auto">=C2=A0 =C2=A0 ++s_first, ++s_last, ++=
dest</div><div dir=3D"auto">){</div><div dir=3D"auto">=C2=A0 =C2=A0 dest-&g=
t;some_op(s_first, s_last);</div><div dir=3D"auto">}</div></div></blockquot=
e><div><br></div></div><div>I would prefer it to look like:<br><div style=
=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border-=
style:solid;border-width:1px" class=3D"gmail-m_-7361981778010919460m_209702=
0166902175272prettyprint"><code class=3D"gmail-m_-7361981778010919460m_2097=
020166902175272prettyprint"><div class=3D"gmail-m_-7361981778010919460m_209=
7020166902175272subprettyprint"><span style=3D"color:rgb(0,0,136)" class=3D=
"gmail-m_-7361981778010919460m_2097020166902175272styled-by-prettify">for</=
span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-7361981778010919460=
m_2097020166902175272styled-by-prettify"> </span><span style=3D"color:rgb(1=
02,102,0)" class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled=
-by-prettify">(</span><span style=3D"color:rgb(0,0,136)" class=3D"gmail-m_-=
7361981778010919460m_2097020166902175272styled-by-prettify">auto</span><spa=
n style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-7361981778010919460m_209=
7020166902175272styled-by-prettify">&</span><span style=3D"color:rgb(0,=
0,0)" class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-p=
rettify"> </span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-736=
1981778010919460m_2097020166902175272styled-by-prettify">[</span><span styl=
e=3D"color:rgb(0,0,0)" class=3D"gmail-m_-7361981778010919460m_2097020166902=
175272styled-by-prettify">range</span><span style=3D"color:rgb(102,102,0)" =
class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-prettif=
y">,</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-7361981778010=
919460m_2097020166902175272styled-by-prettify"> dest</span><span style=3D"c=
olor:rgb(102,102,0)" class=3D"gmail-m_-7361981778010919460m_209702016690217=
5272styled-by-prettify">]</span><span style=3D"color:rgb(0,0,0)" class=3D"g=
mail-m_-7361981778010919460m_2097020166902175272styled-by-prettify"> </span=
><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-7361981778010919460=
m_2097020166902175272styled-by-prettify">:</span><span style=3D"color:rgb(0=
,0,0)" class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-=
prettify"> zip</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_=
-7361981778010919460m_2097020166902175272styled-by-prettify">(</span><span =
style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-7361981778010919460m_209702016=
6902175272styled-by-prettify">range_window</span><span style=3D"color:rgb(1=
02,102,0)" class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled=
-by-prettify">(</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-73=
61981778010919460m_2097020166902175272styled-by-prettify">source</span><spa=
n style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-7361981778010919460m_209=
7020166902175272styled-by-prettify">,</span><span style=3D"color:rgb(0,0,0)=
" class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-prett=
ify"> N</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-736198=
1778010919460m_2097020166902175272styled-by-prettify">),</span><span style=
=3D"color:rgb(0,0,0)" class=3D"gmail-m_-7361981778010919460m_20970201669021=
75272styled-by-prettify"> destination</span><span style=3D"color:rgb(102,10=
2,0)" class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-p=
rettify">))</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-736198=
1778010919460m_2097020166902175272styled-by-prettify"><br></span><span styl=
e=3D"color:rgb(102,102,0)" class=3D"gmail-m_-7361981778010919460m_209702016=
6902175272styled-by-prettify">{</span><span style=3D"color:rgb(0,0,0)" clas=
s=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-prettify"><=
br>=C2=A0 =C2=A0dest</span><span style=3D"color:rgb(102,102,0)" class=3D"gm=
ail-m_-7361981778010919460m_2097020166902175272styled-by-prettify">.</span>=
<span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-7361981778010919460m_209=
7020166902175272styled-by-prettify">some_op</span><span style=3D"color:rgb(=
102,102,0)" class=3D"gmail-m_-7361981778010919460m_2097020166902175272style=
d-by-prettify">(</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-7=
361981778010919460m_2097020166902175272styled-by-prettify">range</span><spa=
n style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-7361981778010919460m_209=
7020166902175272styled-by-prettify">.</span><span style=3D"color:rgb(0,0,13=
6)" class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-pre=
ttify">begin</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-7=
361981778010919460m_2097020166902175272styled-by-prettify">(),</span><span =
style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-7361981778010919460m_209702016=
6902175272styled-by-prettify"> range</span><span style=3D"color:rgb(102,102=
,0)" class=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-pr=
ettify">.</span><span style=3D"color:rgb(0,0,136)" class=3D"gmail-m_-736198=
1778010919460m_2097020166902175272styled-by-prettify">end</span><span style=
=3D"color:rgb(102,102,0)" class=3D"gmail-m_-7361981778010919460m_2097020166=
902175272styled-by-prettify">());</span><span style=3D"color:rgb(0,0,0)" cl=
ass=3D"gmail-m_-7361981778010919460m_2097020166902175272styled-by-prettify"=
><br></span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-73619817=
78010919460m_2097020166902175272styled-by-prettify">}</span><span style=3D"=
color:rgb(0,0,0)" class=3D"gmail-m_-7361981778010919460m_209702016690217527=
2styled-by-prettify"><br></span></div></code></div></div></span></div></blo=
ckquote></div></div><div dir=3D"auto"><br></div><div dir=3D"auto"><br></div=
><div dir=3D"auto">That makes sense in this situation. My concern is that t=
here are arbitrary operations with pointers and wrapping them in functions =
isn't always the preferable solution. The general solution is:</div><di=
v dir=3D"auto"><br></div><div dir=3D"auto">{</div><div dir=3D"auto">=C2=A0 =
=C2=A0 =C2=A0initialize</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0while(co=
ndition){</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 body</d=
iv><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 increment</div><div=
dir=3D"auto">=C2=A0 =C2=A0 =C2=A0}</div><div dir=3D"auto">}</div><div dir=
=3D"auto"><br></div><div dir=3D"auto">And this is exactly how</div><div dir=
=3D"auto"><br></div><div dir=3D"auto">for(initialize; condition; increment)=
{</div><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0body</div><div dir=3D"auto">}<=
/div><div dir=3D"auto"><br></div><div dir=3D"auto">is defined, except that =
we are limited to one statement for "initialize". Making that one=
statement a bit more powerful in a way which breaks no old code, and is ju=
st as easy to read, is a benefit. Sure we can come up with an entire zoo of=
handy views and sub-functions to get this same functionality, but I wouldn=
't always call that preferable.</div></div><span class=3D"gmail-">
-- <br>
You received this message because you are subscribed to a topic in the Goog=
le Groups "ISO C++ Standard - Future Proposals" group.<br>
To unsubscribe from this topic, visit <a href=3D"https://groups.google.com/=
a/isocpp.org/d/topic/std-proposals/lk5oLy6qM7Q/unsubscribe" target=3D"_blan=
k">https://groups.google.com/a/<wbr>isocpp.org/d/topic/std-<wbr>proposals/l=
k5oLy6qM7Q/<wbr>unsubscribe</a>.<br>
To unsubscribe from this group and all its topics, send an email to <a href=
=3D"mailto:std-proposals+unsubscribe@isocpp.org" target=3D"_blank">std-prop=
osals+unsubscribe@<wbr>isocpp.org</a>.<br>
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org" target=3D"_blank">std-proposals@isocpp.org</a>.<br></span>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCPSw-HJewUbR9Py_2qmU2xgq-3vCU=
9pciiPTNQucomWEw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r" target=3D"_blank">https://groups.google.com/a/<wbr>isocpp.org/d/msgid/st=
d-<wbr>proposals/CAC%2B0CCPSw-<wbr>HJewUbR9Py_2qmU2xgq-<wbr>3vCU9pciiPTNQuc=
omWEw%40mail.<wbr>gmail.com</a>.<br>
</blockquote></div></div><div class=3D"gmail_extra"><br></div><div class=3D=
"gmail_extra">You are right that view are not silver bullet that will fix a=
ll possible problems and in the and we will need use old `for` for some cas=
es. Question is how many times you have case that using some standard view =
or writing new one (even if it will be use only one time) will be inappropr=
iate? Exactly where line is in many times depend on taste but overall we co=
uld agree on order of magnitude.</div><div class=3D"gmail_extra">How often =
you need have to write this loops that can not be replaces by view? If it w=
ill happens very often then indeed this change could improve overall langue=
but if is not? Then I will leave this as is.</div><div class=3D"gmail_extr=
a"><br></div><div class=3D"gmail_extra">BTW in `for` the `initialize` is eq=
ually powerful as `increment`, you can assign multiple variables in stateme=
nt, only problem is that allow only one declaration statement. In old C thi=
s was not problem because it was forbidden to declare variables in the midd=
le of function.<br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CACZhb08H8yKSYW5yNoDVN5fzm6T9UxUJkPax=
C1GB_gNXijrytg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CACZhb08H8yKSYW5y=
NoDVN5fzm6T9UxUJkPaxC1GB_gNXijrytg%40mail.gmail.com</a>.<br />
--94eb2c1b1f2e0a63b50562463468--
.
Author: inkwizytoryankes@gmail.com
Date: Mon, 8 Jan 2018 08:58:57 -0800 (PST)
Raw View
------=_Part_4481_447361182.1515430737983
Content-Type: multipart/alternative;
boundary="----=_Part_4482_1611647602.1515430737984"
------=_Part_4482_1611647602.1515430737984
Content-Type: text/plain; charset="UTF-8"
On Monday, January 8, 2018 at 5:20:22 PM UTC+1, mihailn...@gmail.com wrote:
>
>
>
> On Monday, January 8, 2018 at 4:21:07 PM UTC+2, Marcin Jaczewski wrote:
>>
>>
>>
>> On Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrote:
>>>
>>>
>>>
>>> On 8 Jan 2018 05:40, "Nicol Bolas" <jmck...@gmail.com> wrote:
>>>
>>>
>>> 3) It introduces variables that aren't actually used. After all, the `//
>>> use` part doesn't care about `src_p` and `dst_p`. It will never modify
>>> those variables; it only uses what they point to.
>>>
>>>
>>> That's an assumption. For the specific 2d image iteration it very well
>>> might be the case but there are situations in data processing in which it
>>> is not. For example, operations/observations on local windows of data. This
>>> is not uncommon.
>>>
>>> For me, any "solution" which removes my access to a range of N elements
>>> before the one explicitly pointed to by the loop iterator is useless.
>>>
>>> for(
>>> auto s_first = cbegin(source),
>>> s_last = s_first + N,
>>> dest = begin(destination);
>>> s_last != cend(source);
>>> ++s_first, ++s_last, ++dest
>>> ){
>>> dest->some_op(s_first, s_last);
>>> }
>>>
>>
>> I would prefer it to look like:
>> for (auto& [range, dest] : zip(range_window(source, N), destination))
>> {
>> dest.some_op(range.begin(), range.end());
>> }
>>
>>
>>
> Ironically examples like this only prove the need for multiple variables
> declaration - range and dest are two variables, both of different type.
>
> Technically this is only one variable with two properties, but this is
detail.
> Sure it is better written that way, but can it be *always* written like
> that? Nicol Bolas will say Yes, but I doubt.
> Sometimes there might be a need for more control over the variables (or
> the iteration), sometimes it might cumbersome to wrap everything in pretty
> range interfaces.
>
> Manual variable initialization will always have its place.
>
Yes, but how often it will be needed? If 99% loops are handled by views and
1% by classic `for`, then it will be still worth change language for them?
>
>
> And as I said, it is not just for. Other use case are bound to come:
>
> if(auto lock = std::lock_guard(mtx)
> , queue = getQueue();
> !queue.empty())
> {
> // use queue
> }
>
> if(auto a = weakA.lock()
> , b = weakB.lock();
> a && b)
> {
> // use a and b
> }
>
> These are pretty reasonable.
> Sooner or later the one variable or multiple with the same type
> limitations will become too limiting, simply because they don't have *any*
> semantic sense.
> At that point people will just start using hacks (like the tuple one).
>
But at some point I think that lot better would be if this `if` was split,
because too much happens after `if(`. Much better would be in some cases
current solution:
{
auto a = weakA.lock();
auto b = weakB.lock();
if(a && b)
{
// use a and b
}
}
I consider new `if` syntax is for trivial cases, not for all possible
initializations. If `if` initialization do not fit one line than it should
not have any initialization.
--
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/b5e4780f-c2bc-4e0d-80f5-853ff742e3d9%40isocpp.org.
------=_Part_4482_1611647602.1515430737984
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Monday, January 8, 2018 at 5:20:22 PM UTC+1, mi=
hailn...@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 Monday, January 8, 2018 at 4:21:07 PM UTC+2, Marcin =
Jaczewski 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"><b=
r><br>On Monday, January 8, 2018 at 10:01:53 AM UTC+1, Jake Arkinstall wrot=
e:<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"auto"><br><div dir=3D=
"auto"><br><div class=3D"gmail_quote">On 8 Jan 2018 05:40, "Nicol Bola=
s" <<a rel=3D"nofollow">jmck...@gmail.com</a>> wrote:<br type=3D=
"attribution"><blockquote style=3D"margin:0 0 0 .8ex;border-left:1px #ccc s=
olid;padding-left:1ex"><div dir=3D"ltr"><div></div></div></blockquote></div=
></div><div dir=3D"auto"><div class=3D"gmail_quote"><blockquote style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"lt=
r"><div><br></div><div>3) It introduces variables that aren't actually =
used. After all, the `// use` part doesn't care about `src_p` and `dst_=
p`. It will never modify those variables; it only uses what they point to.<=
/div></div></blockquote></div></div><div dir=3D"auto"><br></div><div dir=3D=
"auto">That's an assumption. For the specific 2d image iteration it ver=
y well might be the case but there are situations in data processing in whi=
ch it is not. For example, operations/observations on local windows of data=
.. This is not uncommon.</div><div dir=3D"auto"><br></div><div dir=3D"auto">=
For me, any "solution" which removes my access to a range of N el=
ements before the one explicitly pointed to by the loop iterator is useless=
..</div><div dir=3D"auto"><br></div><div dir=3D"auto">for(</div><div dir=3D"=
auto">=C2=A0 =C2=A0 auto s_first =3D cbegin(source),</div><div dir=3D"auto"=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0s_last =3D s_first + N,</d=
iv><div dir=3D"auto">=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0dest =
=3D begin(destination);</div><div dir=3D"auto">=C2=A0 =C2=A0 s_last !=3D ce=
nd(source);</div><div dir=3D"auto">=C2=A0 =C2=A0 ++s_first, ++s_last, ++des=
t</div><div dir=3D"auto">){</div><div dir=3D"auto">=C2=A0 =C2=A0 dest->s=
ome_op(s_first, s_last);</div><div dir=3D"auto">}</div></div></blockquote><=
div><br></div><div>I would prefer it to look like:<br><div style=3D"backgro=
und-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid=
;border-width:1px"><code><div><span style=3D"color:#008">for</span><span st=
yle=3D"color:#000"> </span><span style=3D"color:#660">(</span><span style=
=3D"color:#008">auto</span><span style=3D"color:#660">&</span><span sty=
le=3D"color:#000"> </span><span style=3D"color:#660">[</span><span style=3D=
"color:#000">range</span><span style=3D"color:#660">,</span><span style=3D"=
color:#000"> dest</span><span style=3D"color:#660">]</span><span style=3D"c=
olor:#000"> </span><span style=3D"color:#660">:</span><span style=3D"color:=
#000"> zip</span><span style=3D"color:#660">(</span><span style=3D"color:#0=
00">range_window</span><span style=3D"color:#660">(</span><span style=3D"co=
lor:#000">source</span><span style=3D"color:#660">,</span><span style=3D"co=
lor:#000"> N</span><span style=3D"color:#660">),</span><span style=3D"color=
:#000"> destination</span><span style=3D"color:#660">))</span><span style=
=3D"color:#000"><br></span><span style=3D"color:#660">{</span><span style=
=3D"color:#000"><br>=C2=A0 =C2=A0dest</span><span style=3D"color:#660">.</s=
pan><span style=3D"color:#000">some_op</span><span style=3D"color:#660">(</=
span><span style=3D"color:#000">range</span><span style=3D"color:#660">.</s=
pan><span style=3D"color:#008">begin</span><span style=3D"color:#660">(),</=
span><span style=3D"color:#000"> range</span><span style=3D"color:#660">.</=
span><span style=3D"color:#008">end</span><span style=3D"color:#660">());</=
span><span style=3D"color:#000"><br></span><span style=3D"color:#660">}</sp=
an><span style=3D"color:#000"><br></span></div></code></div><br> <br></div>=
</div></blockquote><div><br></div><div>Ironically examples like this only p=
rove the need for multiple variables declaration - range and dest are two v=
ariables, both of different type. </div><div><br></div></div></blockquote><=
div>Technically this is only one variable with two properties, but this is =
detail.<br></div><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=
=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: =
1ex;"><div dir=3D"ltr"><div></div><div>Sure it is better written that way, =
but can it be *always* written like that? Nicol Bolas will say Yes, but I d=
oubt. <br>Sometimes there might be a need for more control over the variabl=
es (or the iteration), sometimes it might cumbersome to wrap everything in =
pretty range interfaces. </div><div><br>Manual variable initialization will=
always have its place.</div></div></blockquote><div><br></div><div>Yes, bu=
t how often it will be needed? If 99% loops are handled by views and 1% by =
classic `for`, then it will be still worth change language for them?<br></d=
iv><div>=C2=A0</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"><div><span style=3D"text-align:left;color:rgb(34,34,34);text-trans=
form:none;text-indent:0px;letter-spacing:normal;font-size:13px;font-variant=
:normal;font-weight:400;text-decoration:none;word-spacing:0px;display:inlin=
e!important;white-space:normal;float:none;background-color:transparent"><br=
></span></div><div><b><font face=3D"arial,sans-serif"><i><br></i></font></b=
></div><div>And as I said, it is not just <font face=3D"courier new,monospa=
ce">for</font>. Other use case are bound to come:</div><div><br></div><div>=
<font face=3D"courier new,monospace">if(auto lock =3D std::lock_guard(mtx)<=
br>=C2=A0=C2=A0 , queue =3D getQueue(); <br>=C2=A0=C2=A0 !queue.empty())<br=
>{<br>=C2=A0=C2=A0 // use queue</font></div><div><font face=3D"courier new,=
monospace"> }</font></div><div><font face=3D"courier new"><br></font></div>=
<div><font face=3D"courier new,monospace">if(auto a =3D weakA.lock()<br>=C2=
=A0=C2=A0 , b =3D weakB.lock();<br>=C2=A0=C2=A0 a && b)<br>{<br>=C2=
=A0 // use a and b<br>}</font></div><div><font face=3D"courier new,monospac=
e"><br></font></div><div><font face=3D"arial,sans-serif">These are pretty r=
easonable. </font></div><div><font face=3D"arial,sans-serif">Sooner or late=
r the one variable or multiple with the same type limitations will become t=
oo limiting, simply because they don't have <i>any</i> semantic sense.<=
/font></div><div>At that point people will just start using hacks (like the=
tuple one). <br></div></div></blockquote><div>=C2=A0</div><div>But at some=
point I think that lot better would be if this `if` was split, because too=
much happens after `if(`. Much better would be in some cases current solut=
ion:</div><div><div style=3D"background-color: rgb(250, 250, 250); border-c=
olor: rgb(187, 187, 187); border-style: solid; border-width: 1px; overflow-=
wrap: break-word;" class=3D"prettyprint"><code class=3D"prettyprint"><div c=
lass=3D"subprettyprint"><span style=3D"color: #660;" class=3D"styled-by-pre=
ttify">{</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><b=
r>=C2=A0 =C2=A0 </span><span style=3D"color: #008;" class=3D"styled-by-pret=
tify">auto</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
a </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> weakA</span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">.</span><span styl=
e=3D"color: #008;" class=3D"styled-by-prettify">lock</span><span style=3D"c=
olor: #660;" class=3D"styled-by-prettify">();</span><span style=3D"color: #=
000;" class=3D"styled-by-prettify"><br>=C2=A0 =C2=A0 </span><span style=3D"=
color: #008;" class=3D"styled-by-prettify">auto</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"> b </span><span style=3D"color: #660;"=
class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> weakB</span><span style=3D"color: #660;" class=3D"=
styled-by-prettify">.</span><span style=3D"color: #008;" class=3D"styled-by=
-prettify">lock</span><span style=3D"color: #660;" class=3D"styled-by-prett=
ify">();</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><b=
r>=C2=A0 =C2=A0 </span><span style=3D"color: #008;" class=3D"styled-by-pret=
tify">if</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify">a </span><s=
pan style=3D"color: #660;" class=3D"styled-by-prettify">&&</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> b</span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify">)</span><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"><br>=C2=A0 =C2=A0 </span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">{</span><span style=3D"color=
: #000;" class=3D"styled-by-prettify"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 </spa=
n><span style=3D"color: #800;" class=3D"styled-by-prettify">// use a and b<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>=C2=A0 =
=C2=A0 </span><span style=3D"color: #660;" class=3D"styled-by-prettify">}</=
span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br></span><=
span style=3D"color: #660;" class=3D"styled-by-prettify">}</span><span styl=
e=3D"color: #000;" class=3D"styled-by-prettify"><br></span></div></code></d=
iv>I consider new `if` syntax is for trivial cases, not for all possible in=
itializations. If `if` initialization do not fit one line than it should no=
t have any initialization.<br><br></div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/b5e4780f-c2bc-4e0d-80f5-853ff742e3d9%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/b5e4780f-c2bc-4e0d-80f5-853ff742e3d9=
%40isocpp.org</a>.<br />
------=_Part_4482_1611647602.1515430737984--
------=_Part_4481_447361182.1515430737983--
.
Author: Jake Arkinstall <jake.arkinstall@gmail.com>
Date: Mon, 8 Jan 2018 17:31:44 +0000
Raw View
--001a11c1418c1ce10a0562472ca3
Content-Type: text/plain; charset="UTF-8"
On 8 Jan 2018 16:22, "Marcin Jaczewski" <marcinjaczewski86@gmail.com> wrote:
You are right that view are not silver bullet that will fix all possible
problems and in the and we will need use old `for` for some cases. Question
is how many times you have case that using some standard view or writing
new one (even if it will be use only one time) will be inappropriate?
Exactly where line is in many times depend on taste but overall we could
agree on order of magnitude.
How often you need have to write this loops that can not be replaces by
view? If it will happens very often then indeed this change could improve
overall langue but if is not? Then I will leave this as is.
Actually, my concern is about maintainability. Okay, sure, iterator-based
approaches aren't always pretty, but they're very flexible and easy to
modify without much thought. How would the provided example change, for
example, if I wanted to start the iteration through the destination
collection at N elements after the beginning? At least another function or
another view on the destination collection - vs just "+ N" with iterators.
Sure, I understand that we are moving towards a more poetic, almost
pythonic, approach to loops, but sometimes the iterator approach is useful
specifically because you can do arbitrary non-trivial things with them. I'm
in favour of allowing prettier ways of doing things as much as the next
guy, but there are always going to be some cases where the iterator
approach is prettier than using combinations of functions and views. Giving
those more power, again without breaking changes, doesn't seem like
something that should need this amount of defending.
--
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/CAC%2B0CCOMCXVaL8Dh7n6wV%2BUaFhhgNBRtqLFeJYVfAwjP%3DOiPsg%40mail.gmail.com.
--001a11c1418c1ce10a0562472ca3
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto"><div><br><div class=3D"gmail_extra"><br><div class=3D"gma=
il_quote">On 8 Jan 2018 16:22, "Marcin Jaczewski" <<a href=3D"=
mailto:marcinjaczewski86@gmail.com">marcinjaczewski86@gmail.com</a>> wro=
te:<blockquote class=3D"quote" style=3D"margin:0 0 0 .8ex;border-left:1px #=
ccc solid;padding-left:1ex"><div dir=3D"ltr"><div class=3D"gmail_extra">You=
are right that view are not silver bullet that will fix all possible probl=
ems and in the and we will need use old `for` for some cases. Question is h=
ow many times you have case that using some standard view or writing new on=
e (even if it will be use only one time) will be inappropriate? Exactly whe=
re line is in many times depend on taste but overall we could agree on orde=
r of magnitude.</div><div class=3D"gmail_extra">How often you need have to =
write this loops that can not be replaces by view? If it will happens very =
often then indeed this change could improve overall langue but if is not? T=
hen I will leave this as is.</div></div></blockquote></div></div></div><div=
dir=3D"auto"><br></div><div dir=3D"auto">Actually, my concern is about mai=
ntainability. Okay, sure, iterator-based approaches aren't always prett=
y, but they're very flexible and easy to modify without much thought. H=
ow would the provided example change, for example, if I wanted to start the=
iteration through the destination collection at N elements after the begin=
ning? At least another function or another view on the destination collecti=
on - vs just "+ N" with iterators.</div><div dir=3D"auto"><br></d=
iv><div dir=3D"auto">Sure, I understand that we are moving towards a more p=
oetic, almost pythonic, approach to loops, but sometimes the iterator appro=
ach is useful specifically because you can do arbitrary non-trivial things =
with them. I'm in favour of allowing prettier ways of doing things as m=
uch as the next guy, but there are always going to be some cases where the =
iterator approach is prettier than using combinations of functions and view=
s. Giving those more power, again without breaking changes, doesn't see=
m like something that should need this amount of defending.</div></div>
<p></p>
-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals" 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/CAC%2B0CCOMCXVaL8Dh7n6wV%2BUaFhhgNBRt=
qLFeJYVfAwjP%3DOiPsg%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfoote=
r">https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAC%2B0CCOM=
CXVaL8Dh7n6wV%2BUaFhhgNBRtqLFeJYVfAwjP%3DOiPsg%40mail.gmail.com</a>.<br />
--001a11c1418c1ce10a0562472ca3--
.