Topic: Idea for a proposal
Author: Nicole Mazzuca <npmazzuca@gmail.com>
Date: Wed, 12 Jul 2017 02:52:20 -0700
Raw View
`Concept` in return type position:
I was talking with some people on the cpplang slack about Bjarne's
latest paper on concepts in function parameter context, and I thought
of something I would find very useful. Basically:
```
Concept foo();
```
should be equivalent to
```
auto foo();
```
except that the compiler makes certain that the deduced return type
satisfies the concept Concept; this would be useful for documentation,
without committing to a specific return type, while also making
certain that the compiler actually checks all instantiations. This
would be especially useful if, eventually, C++ gets definition
checking. However, for now, it would only check each instantiation.
This is clearly incompatible with Bjarne's proposed consistent concept
types, but it works well with independent concept types, and is, I
think, a good argument for them. A real world example where they would
be useful:
```
// note: Iterable<T, U> means that U is an iterable with value_type T
template <typename T, Iterable<T> It, typename F>
auto map(It it, F f) -> Iterable<decltype(f(std::declval<T>()))> {
struct ret {
struct ret_iter {
decltype(it.begin()) begin;
F map;
// etc.
};
struct ret_iter_end {
decltype(it.end()) end;
};
It iterable;
// etc.
}
return ret(std::move(it), std::move(f));
}
```
It's unimportant that the return type of map is `map::ret`; only that
it's an iterable with value_type that's equal to the return type of
the passed functor applied to the value_type of the iterable passed
in.
- Nicole Mazzuca (ubsan)
--
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/CAEwx-OtH36J13PDD1H_8i0P4%3DNUYktFdJq7eZFyFKuwMi-WM5Q%40mail.gmail.com.
.
Author: npmazzuca@gmail.com
Date: Wed, 12 Jul 2017 03:03:05 -0700 (PDT)
Raw View
------=_Part_8102_304236050.1499853785578
Content-Type: multipart/alternative;
boundary="----=_Part_8103_1624668753.1499853785578"
------=_Part_8103_1624668753.1499853785578
Content-Type: text/plain; charset="UTF-8"
Notes that I forgot to put down because it's 3 in the morning:
This is impossible to represent without something like this. The closest
you can get is a `static_assert`, but it won't trigger on all
instantiations.
"Bjarne's Latest Proposal" - P0694R0
`Iterable<T>` can become `ranges::InputRange<T>`, I believe
--
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/47f870e1-2eae-44df-8b06-392704091f4e%40isocpp.org.
------=_Part_8103_1624668753.1499853785578
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>Notes that I forgot to put down because it's 3 in=
the morning:</div><div><br></div><div>This is impossible to represent with=
out something like this. The closest you can get is a `static_assert`, but =
it won't trigger on all instantiations.</div><div>"Bjarne's La=
test Proposal" - P0694R0<br></div><div>`Iterable<T>` can become =
`ranges::InputRange<T>`, I believe</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/47f870e1-2eae-44df-8b06-392704091f4e%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/47f870e1-2eae-44df-8b06-392704091f4e=
%40isocpp.org</a>.<br />
------=_Part_8103_1624668753.1499853785578--
------=_Part_8102_304236050.1499853785578--
.
Author: npmazzuca@gmail.com
Date: Wed, 12 Jul 2017 03:45:58 -0700 (PDT)
Raw View
------=_Part_7970_844947110.1499856358636
Content-Type: multipart/alternative;
boundary="----=_Part_7971_1229316935.1499856358636"
------=_Part_7971_1229316935.1499856358636
Content-Type: text/plain; charset="UTF-8"
Another note: these semantics were hinted at in P0464R2, but never actually
defined.
--
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/3336bf79-6bdb-4c10-a554-b92029407bc9%40isocpp.org.
------=_Part_7971_1229316935.1499856358636
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">Another note: these semantics were hinted at in P0464R2, b=
ut never actually defined.</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/3336bf79-6bdb-4c10-a554-b92029407bc9%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/3336bf79-6bdb-4c10-a554-b92029407bc9=
%40isocpp.org</a>.<br />
------=_Part_7971_1229316935.1499856358636--
------=_Part_7970_844947110.1499856358636--
.
Author: =?UTF-8?Q?Jonathan_M=c3=bcller?= <jonathanmueller.dev@gmail.com>
Date: Wed, 12 Jul 2017 21:40:14 +0200
Raw View
On 12.07.2017 11:52, Nicole Mazzuca wrote:
> `Concept` in return type position:
>
> I was talking with some people on the cpplang slack about Bjarne's
> latest paper on concepts in function parameter context, and I thought
> of something I would find very useful. Basically:
>
> ```
> Concept foo();
> ```
>
> should be equivalent to
>
> ```
> auto foo();
> ```
>
Wait, that's not what this currently is?
What does it mean right now?
--
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/915caa4a-875c-2540-6941-fbe019aa2b47%40gmail.com.
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Wed, 12 Jul 2017 14:19:54 -0700 (PDT)
Raw View
------=_Part_85_432663681.1499894394975
Content-Type: multipart/alternative;
boundary="----=_Part_86_331590939.1499894394975"
------=_Part_86_331590939.1499894394975
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
On Wednesday, July 12, 2017 at 3:40:20 PM UTC-4, Jonathan M=C3=BCller wrote=
:
>
> On 12.07.2017 11:52, Nicole Mazzuca wrote:=20
> > `Concept` in return type position:=20
> >=20
> > I was talking with some people on the cpplang slack about Bjarne's=20
> > latest paper on concepts in function parameter context, and I thought=
=20
> > of something I would find very useful. Basically:=20
> >=20
> > ```=20
> > Concept foo();=20
> > ```=20
> >=20
> > should be equivalent to=20
> >=20
> > ```=20
> > auto foo();=20
> > ```=20
> >=20
>
> Wait, that's not what this currently is?=20
> What does it mean right now?=20
>
What it means right now is:
Concept foo();
becomes
template<typename T> requires Concept<T> T foo();
With the current wording, `foo` is a template function. With the new=20
wording, `foo` is not a template function; it's just a regular function=20
with an automatically deduced return type.
In both cases, the definition needs to be available in the TU (outside of=
=20
explicit template specializations), since the compiler needs to figure out=
=20
what the return type actually will be.
--=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/15d714d7-4454-4022-87f0-808a60619f05%40isocpp.or=
g.
------=_Part_86_331590939.1499894394975
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Wednesday, July 12, 2017 at 3:40:20 PM UTC-4, Jonathan =
M=C3=BCller wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;marg=
in-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;">On 12.07.201=
7 11:52, Nicole Mazzuca wrote:
<br>> `Concept` in return type position:
<br>>=20
<br>> I was talking with some people on the cpplang slack about Bjarne&#=
39;s
<br>> latest paper on concepts in function parameter context, and I thou=
ght
<br>> of something I would find very useful. Basically:
<br>>=20
<br>> ```
<br>> Concept foo();
<br>> ```
<br>>=20
<br>> should be equivalent to
<br>>=20
<br>> ```
<br>> auto foo();
<br>> ```
<br>>=20
<br>
<br>Wait, that's not what this currently is?
<br>What does it mean right now?
<br></blockquote><div><br>What it means right now is:<br><br><div style=3D"=
background-color: rgb(250, 250, 250); border-color: rgb(187, 187, 187); bor=
der-style: solid; border-width: 1px; overflow-wrap: break-word;" class=3D"p=
rettyprint"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span=
style=3D"color: #606;" class=3D"styled-by-prettify">Concept</span><span st=
yle=3D"color: #000;" class=3D"styled-by-prettify"> foo</span><span style=3D=
"color: #660;" class=3D"styled-by-prettify">();</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"><br><br>becomes<br><br></span><span st=
yle=3D"color: #008;" class=3D"styled-by-prettify">template</span><span styl=
e=3D"color: #660;" class=3D"styled-by-prettify"><</span><span style=3D"c=
olor: #008;" class=3D"styled-by-prettify">typename</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> T</span><span style=3D"color: #660=
;" class=3D"styled-by-prettify">></span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"> requires </span><span style=3D"color: #606;" cla=
ss=3D"styled-by-prettify">Concept</span><span style=3D"color: #660;" class=
=3D"styled-by-prettify"><</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify">T</span><span style=3D"color: #660;" class=3D"styled-by-p=
rettify">></span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"> T foo</span><span style=3D"color: #660;" class=3D"styled-by-prettify">(=
);</span></div></code></div><br>With the current wording, `foo` is a templa=
te function. With the new wording, `foo` is not a template function; it'=
;s just a regular function with an automatically deduced return type.<br><b=
r>In both cases, the definition needs to be available in the TU (outside of=
explicit template specializations), since the compiler needs to figure out=
what the return type actually will be.<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/15d714d7-4454-4022-87f0-808a60619f05%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/15d714d7-4454-4022-87f0-808a60619f05=
%40isocpp.org</a>.<br />
------=_Part_86_331590939.1499894394975--
------=_Part_85_432663681.1499894394975--
.
Author: Barry Revzin <barry.revzin@gmail.com>
Date: Wed, 12 Jul 2017 14:36:14 -0700 (PDT)
Raw View
------=_Part_103_1715951762.1499895374933
Content-Type: multipart/alternative;
boundary="----=_Part_104_624260451.1499895374933"
------=_Part_104_624260451.1499895374933
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
>
>
> What it means right now is:
>
> Concept foo();
>
> becomes
>
> template<typename T> requires Concept<T> T foo();
>
>
I don't think that's true? The wording in N4674 is=20
A constrained-type-specifier C1 within the declared return type of an=20
> abbreviated function template declaration does not designate a placeholde=
r=20
> if its introduced constraint-expression (10.1.7.4.2) is determined to be=
=20
> equivalent, using the rules in 17.6.5.1 for comparing expressions, to the=
=20
> introduced constraint-expression for a constrained-type-specifier C2 in t=
he=20
> parameter-declaration-clause of that function declaration. Instead, C1 is=
=20
> replaced by the template parameter invented for C2 (11.3.5).
Since Concept isn't used anywhere else, then it still counts as a=20
placeholder. So:
Concept foo(Concept ); // <=3D=3D> template <class T> requires Concept<T>=
=20
// T foo(T );
Concept foo(); // <=3D=3D> auto foo();=20
// static_assert(Concept<decltype(foo())>);
There's also examples like:
template <typename T> concept bool C =3D true;
template <typename T> concept bool D =3D false;
C z1 =3D 0; // OK: z1 has type int
D z2 =3D 0; // error: constraints not satisfied
C cf1() { return 0.0; }; // OK: cf1 returns double
D cf2() { return 0.0; }; // error: constraints not satisfied
auto cf3() -> C; // OK: cf3=E2=80=99s return type will be deduced when it i=
s defined
--=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/65ad7b18-0aa5-49a8-bd19-1887cc8b7649%40isocpp.or=
g.
------=_Part_104_624260451.1499895374933
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><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><br>What it means right now is:<br><br><div style=3D"background-co=
lor:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;borde=
r-width:1px"><code><div><span style=3D"color:#606">Concept</span><span styl=
e=3D"color:#000"> foo</span><span style=3D"color:#660">();</span><span styl=
e=3D"color:#000"><br><br>becomes<br><br></span><span style=3D"color:#008">t=
emplate</span><span style=3D"color:#660"><</span><span style=3D"color:#0=
08">typename</span><span style=3D"color:#000"> T</span><span style=3D"color=
:#660">></span><span style=3D"color:#000"> requires </span><span style=
=3D"color:#606">Concept</span><span style=3D"color:#660"><</span><span s=
tyle=3D"color:#000">T</span><span style=3D"color:#660">></span><span sty=
le=3D"color:#000"> T foo</span><span style=3D"color:#660">();</span></div><=
/code></div><br></div></div></blockquote><div><br></div><div>I don't th=
ink that's true? The wording in N4674 is=C2=A0</div><div><br></div><blo=
ckquote class=3D"gmail_quote" style=3D"margin: 0px 0px 0px 0.8ex; border-le=
ft: 1px solid rgb(204, 204, 204); padding-left: 1ex;">A constrained-type-sp=
ecifier C1 within the declared return type of an abbreviated function templ=
ate
declaration does not designate a placeholder if its introduced constraint-e=
xpression (10.1.7.4.2)
is determined to be equivalent, using the rules in 17.6.5.1 for comparing e=
xpressions, to the introduced
constraint-expression for a constrained-type-specifier C2 in the parameter-=
declaration-clause
of that function declaration. Instead, C1 is replaced by the template param=
eter invented for C2
(11.3.5).</blockquote><div><br></div><div>Since Concept isn't used anyw=
here else, then it still counts as a placeholder. So:</div><div><br></div><=
div><div class=3D"prettyprint" style=3D"background-color: rgb(250, 250, 250=
); border-color: rgb(187, 187, 187); border-style: solid; border-width: 1px=
; word-wrap: break-word;"><code class=3D"prettyprint"><div class=3D"subpret=
typrint"><span style=3D"color: #606;" class=3D"styled-by-prettify">Concept<=
/span><span style=3D"color: #000;" class=3D"styled-by-prettify"> foo</span>=
<span style=3D"color: #660;" class=3D"styled-by-prettify">(</span><span sty=
le=3D"color: #606;" class=3D"styled-by-prettify">Concept</span><span style=
=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color=
: #660;" class=3D"styled-by-prettify">);</span><font color=3D"#880000"><spa=
n style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #800;" class=3D"styled-by-prettify">// <=3D=3D> template &=
lt;class T> requires Concept<T> </span><span style=3D"color: #000;=
" class=3D"styled-by-prettify"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</span><span style=3D"color: #=
800;" class=3D"styled-by-prettify">// =C2=A0 =C2=A0 =C2=A0T foo(T );</span>=
<span style=3D"color: #000;" class=3D"styled-by-prettify"><br><br></span><s=
pan style=3D"color: #606;" class=3D"styled-by-prettify">Concept</span><span=
style=3D"color: #000;" class=3D"styled-by-prettify"> foo</span><span style=
=3D"color: #660;" class=3D"styled-by-prettify">();</span><span style=3D"col=
or: #000;" class=3D"styled-by-prettify"> =C2=A0 =C2=A0 =C2=A0 =C2=A0 </span=
><span style=3D"color: #800;" class=3D"styled-by-prettify">// <=3D=3D>=
; auto foo(); </span><span style=3D"color: #000;" class=3D"styled-by-pretti=
fy"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0</span><span style=3D"color: #800;" class=3D"styled-by-pre=
ttify">// =C2=A0 =C2=A0 =C2=A0static_assert(Concept<decltype(foo())>)=
;</span></font></div></code></div><br>There's also examples like:</div>=
<div><br></div><div><div class=3D"prettyprint" style=3D"background-color: r=
gb(250, 250, 250); border-color: rgb(187, 187, 187); border-style: solid; b=
order-width: 1px; word-wrap: break-word;"><code class=3D"prettyprint"><div =
class=3D"subprettyprint"><span style=3D"color: #008;" class=3D"styled-by-pr=
ettify">template</span><typename t=3D""><span style=3D"color: #000;" class=
=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"style=
d-by-prettify"><</span><span style=3D"color: #008;" class=3D"styled-by-p=
rettify">typename</span><span style=3D"color: #000;" class=3D"styled-by-pre=
ttify"> T</span><span style=3D"color: #660;" class=3D"styled-by-prettify">&=
gt;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span=
><span style=3D"color: #008;" class=3D"styled-by-prettify">concept</span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">bool</span><span style=3D"co=
lor: #000;" class=3D"styled-by-prettify"> C </span><span style=3D"color: #6=
60;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> </span><span style=3D"color: #008;" class=3D"st=
yled-by-prettify">true</span><span style=3D"color: #660;" class=3D"styled-b=
y-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettif=
y"><br></span><span style=3D"color: #008;" class=3D"styled-by-prettify">tem=
plate</span><typename t=3D""><span style=3D"color: #000;" class=3D"styled-b=
y-prettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y"><</span><span style=3D"color: #008;" class=3D"styled-by-prettify">typ=
ename</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> T</s=
pan><span style=3D"color: #660;" class=3D"styled-by-prettify">></span><s=
pan style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=
=3D"color: #008;" class=3D"styled-by-prettify">concept</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #=
008;" class=3D"styled-by-prettify">bool</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> D </span><span style=3D"color: #660;" class=
=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"> </span><span style=3D"color: #008;" class=3D"styled-by-pr=
ettify">false</span><span style=3D"color: #660;" class=3D"styled-by-prettif=
y">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify"><br>C =
z1 </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=3D</sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span =
style=3D"color: #066;" class=3D"styled-by-prettify">0</span><span style=3D"=
color: #660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #0=
00;" class=3D"styled-by-prettify"> </span><span style=3D"color: #800;" clas=
s=3D"styled-by-prettify">// OK: z1 has type int</span><span style=3D"color:=
#000;" class=3D"styled-by-prettify"><br>D z2 </span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">=3D</span><span style=3D"color: #000;" =
class=3D"styled-by-prettify"> </span><span style=3D"color: #066;" class=3D"=
styled-by-prettify">0</span><span style=3D"color: #660;" class=3D"styled-by=
-prettify">;</span><span style=3D"color: #000;" class=3D"styled-by-prettify=
"> </span><span style=3D"color: #800;" class=3D"styled-by-prettify">// erro=
r: constraints not satisfied</span><span style=3D"color: #000;" class=3D"st=
yled-by-prettify"><br>C cf1</span><span style=3D"color: #660;" class=3D"sty=
led-by-prettify">()</span><span style=3D"color: #000;" class=3D"styled-by-p=
rettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">=
{</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><=
span style=3D"color: #008;" class=3D"styled-by-prettify">return</span><span=
style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D=
"color: #066;" class=3D"styled-by-prettify">0.0</span><span style=3D"color:=
#660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #000;" c=
lass=3D"styled-by-prettify"> </span><span style=3D"color: #660;" class=3D"s=
tyled-by-prettify">};</span><span style=3D"color: #000;" class=3D"styled-by=
-prettify"> </span><span style=3D"color: #800;" class=3D"styled-by-prettify=
">// OK: cf1 returns double</span><span style=3D"color: #000;" class=3D"sty=
led-by-prettify"><br>D cf2</span><span style=3D"color: #660;" class=3D"styl=
ed-by-prettify">()</span><span style=3D"color: #000;" class=3D"styled-by-pr=
ettify"> </span><span style=3D"color: #660;" class=3D"styled-by-prettify">{=
</span><span style=3D"color: #000;" class=3D"styled-by-prettify"> </span><s=
pan style=3D"color: #008;" class=3D"styled-by-prettify">return</span><span =
style=3D"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"=
color: #066;" class=3D"styled-by-prettify">0.0</span><span style=3D"color: =
#660;" class=3D"styled-by-prettify">;</span><span style=3D"color: #000;" cl=
ass=3D"styled-by-prettify"> </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: #800;" class=3D"styled-by-prettify"=
>// error: constraints not satisfied</span><span style=3D"color: #000;" cla=
ss=3D"styled-by-prettify"><br></span><span style=3D"color: #008;" class=3D"=
styled-by-prettify">auto</span><span style=3D"color: #000;" class=3D"styled=
-by-prettify"> cf3</span><span style=3D"color: #660;" class=3D"styled-by-pr=
ettify">()</span><span style=3D"color: #000;" class=3D"styled-by-prettify">=
</span><span style=3D"color: #660;" class=3D"styled-by-prettify">-></sp=
an><span style=3D"color: #000;" class=3D"styled-by-prettify"> C</span><span=
style=3D"color: #660;" class=3D"styled-by-prettify">;</span><span style=3D=
"color: #000;" class=3D"styled-by-prettify"> </span><span style=3D"color: #=
800;" class=3D"styled-by-prettify">// OK: cf3=E2=80=99s return type will be=
deduced when it is defined</span></typename></typename><span style=3D"colo=
r: #000;" class=3D"styled-by-prettify"><br></span></div></code></div><br><b=
r></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/65ad7b18-0aa5-49a8-bd19-1887cc8b7649%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/65ad7b18-0aa5-49a8-bd19-1887cc8b7649=
%40isocpp.org</a>.<br />
------=_Part_104_624260451.1499895374933--
------=_Part_103_1715951762.1499895374933--
.
Author: Nicole Mazzuca <npmazzuca@gmail.com>
Date: Sat, 15 Jul 2017 13:03:07 -0700
Raw View
--001a114274ba8a8a25055460a7de
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
Hmm, that makes the current semantics even more strange to me. It's at
least, imo, not very clear. However, if those are the correct semantics, I
guess this is resolved.
On Jul 12, 2017 14:36, "Barry Revzin" <barry.revzin@gmail.com> wrote:
> What it means right now is:
>
> Concept foo();
>
> becomes
>
> template<typename T> requires Concept<T> T foo();
>
>
I don't think that's true? The wording in N4674 is
A constrained-type-specifier C1 within the declared return type of an
> abbreviated function template declaration does not designate a placeholde=
r
> if its introduced constraint-expression (10.1.7.4.2) is determined to be
> equivalent, using the rules in 17.6.5.1 for comparing expressions, to the
> introduced constraint-expression for a constrained-type-specifier C2 in t=
he
> parameter-declaration-clause of that function declaration. Instead, C1 is
> replaced by the template parameter invented for C2 (11.3.5).
Since Concept isn't used anywhere else, then it still counts as a
placeholder. So:
Concept foo(Concept ); // <=3D=3D> template <class T> requires Concept<T>
// T foo(T );
Concept foo(); // <=3D=3D> auto foo();
// static_assert(Concept<decltype(foo())>);
There's also examples like:
template <typename T> concept bool C =3D true;
template <typename T> concept bool D =3D false;
C z1 =3D 0; // OK: z1 has type int
D z2 =3D 0; // error: constraints not satisfied
C cf1() { return 0.0; }; // OK: cf1 returns double
D cf2() { return 0.0; }; // error: constraints not satisfied
auto cf3() -> C; // OK: cf3=E2=80=99s return type will be deduced when it i=
s defined
--=20
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/lzIEK6_-J84/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/65ad7b18-0aa5-49a8-
bd19-1887cc8b7649%40isocpp.org
<https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/65ad7b18-0aa5=
-49a8-bd19-1887cc8b7649%40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter=
>
..
--=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/CAEwx-OsVLrYQkGxLBmwoGvvCSRYPofihR6Xa9R1P-F3aEa1=
ucw%40mail.gmail.com.
--001a114274ba8a8a25055460a7de
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"auto">Hmm, that makes the current semantics even more strange t=
o me. It's at least, imo, not very clear. However, if those are the cor=
rect semantics, I guess this is resolved.</div><div class=3D"gmail_extra"><=
br><div class=3D"gmail_quote">On Jul 12, 2017 14:36, "Barry Revzin&quo=
t; <<a href=3D"mailto:barry.revzin@gmail.com">barry.revzin@gmail.com</a>=
> wrote:<br type=3D"attribution"><blockquote class=3D"quote" style=3D"ma=
rgin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"lt=
r"><div class=3D"quoted-text"><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>What it means right now is:<br><br><div style=3D"backg=
round-color:rgb(250,250,250);border-color:rgb(187,187,187);border-style:sol=
id;border-width:1px"><code><div><span style=3D"color:#606">Concept</span><s=
pan style=3D"color:#000"> foo</span><span style=3D"color:#660">();</span><s=
pan style=3D"color:#000"><br><br>becomes<br><br></span><span style=3D"color=
:#008">template</span><span style=3D"color:#660"><</span><span style=3D"=
color:#008">typename</span><span style=3D"color:#000"> T</span><span style=
=3D"color:#660">></span><span style=3D"color:#000"> requires </span><spa=
n style=3D"color:#606">Concept</span><span style=3D"color:#660"><</span>=
<span style=3D"color:#000">T</span><span style=3D"color:#660">></span><s=
pan style=3D"color:#000"> T foo</span><span style=3D"color:#660">();</span>=
</div></code></div><br></div></div></blockquote><div><br></div></div><div>I=
don't think that's true? The wording in N4674 is=C2=A0</div><div><=
br></div><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">A constrained-ty=
pe-specifier C1 within the declared return type of an abbreviated function =
template
declaration does not designate a placeholder if its introduced constraint-e=
xpression (10.1.7.4.2)
is determined to be equivalent, using the rules in 17.6.5.1 for comparing e=
xpressions, to the introduced
constraint-expression for a constrained-type-specifier C2 in the parameter-=
declaration-clause
of that function declaration. Instead, C1 is replaced by the template param=
eter invented for C2
(11.3.5).</blockquote><div><br></div><div>Since Concept isn't used anyw=
here else, then it still counts as a placeholder. So:</div><div><br></div><=
div><div class=3D"m_6689280322255370458prettyprint" style=3D"background-col=
or:rgb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border=
-width:1px;word-wrap:break-word"><code class=3D"m_6689280322255370458pretty=
print"><div class=3D"m_6689280322255370458subprettyprint"><span style=3D"co=
lor:#606" class=3D"m_6689280322255370458styled-by-prettify">Concept</span><=
span style=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"=
> foo</span><span style=3D"color:#660" class=3D"m_6689280322255370458styled=
-by-prettify">(</span><span style=3D"color:#606" class=3D"m_668928032225537=
0458styled-by-prettify">Concept</span><span style=3D"color:#000" class=3D"m=
_6689280322255370458styled-by-prettify"> </span><span style=3D"color:#660" =
class=3D"m_6689280322255370458styled-by-prettify">);</span><font color=3D"#=
880000"><span style=3D"color:#000" class=3D"m_6689280322255370458styled-by-=
prettify"> </span><span style=3D"color:#800" class=3D"m_6689280322255370458=
styled-by-prettify">// <=3D=3D> template <class T> requires Con=
cept<T> </span><span style=3D"color:#000" class=3D"m_6689280322255370=
458styled-by-prettify"><br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=
=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0</span><span style=3D"color:#800" class=
=3D"m_6689280322255370458styled-by-prettify">// =C2=A0 =C2=A0 =C2=A0T foo(T=
);</span><span style=3D"color:#000" class=3D"m_6689280322255370458styled-b=
y-prettify"><br><br></span><span style=3D"color:#606" class=3D"m_6689280322=
255370458styled-by-prettify">Concept</span><span style=3D"color:#000" class=
=3D"m_6689280322255370458styled-by-prettify"> foo</span><span style=3D"colo=
r:#660" class=3D"m_6689280322255370458styled-by-prettify">();</span><span s=
tyle=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"> =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 </span><span style=3D"color:#800" class=3D"m_66892=
80322255370458styled-by-prettify">// <=3D=3D> auto foo(); </span><spa=
n style=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"><b=
r>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0</span><span style=3D"color:#800" class=3D"m_6689280322255370458s=
tyled-by-prettify">// =C2=A0 =C2=A0 =C2=A0static_assert(Concept<<wbr>dec=
ltype(foo())>);</span></font></div></code></div><br>There's also exa=
mples like:</div><div><br></div><div><div class=3D"m_6689280322255370458pre=
ttyprint" style=3D"background-color:rgb(250,250,250);border-color:rgb(187,1=
87,187);border-style:solid;border-width:1px;word-wrap:break-word"><code cla=
ss=3D"m_6689280322255370458prettyprint"><div class=3D"m_6689280322255370458=
subprettyprint"><span style=3D"color:#008" class=3D"m_6689280322255370458st=
yled-by-prettify">template</span><u></u><span style=3D"color:#000" class=3D=
"m_6689280322255370458styled-by-prettify"> </span><span style=3D"color:#660=
" class=3D"m_6689280322255370458styled-by-prettify"><</span><span style=
=3D"color:#008" class=3D"m_6689280322255370458styled-by-prettify">typename<=
/span><span style=3D"color:#000" class=3D"m_6689280322255370458styled-by-pr=
ettify"> T</span><span style=3D"color:#660" class=3D"m_6689280322255370458s=
tyled-by-prettify">></span><span style=3D"color:#000" class=3D"m_6689280=
322255370458styled-by-prettify"> </span><span style=3D"color:#008" class=3D=
"m_6689280322255370458styled-by-prettify">concept</span><span style=3D"colo=
r:#000" class=3D"m_6689280322255370458styled-by-prettify"> </span><span sty=
le=3D"color:#008" class=3D"m_6689280322255370458styled-by-prettify">bool</s=
pan><span style=3D"color:#000" class=3D"m_6689280322255370458styled-by-pret=
tify"> C </span><span style=3D"color:#660" class=3D"m_6689280322255370458st=
yled-by-prettify">=3D</span><span style=3D"color:#000" class=3D"m_668928032=
2255370458styled-by-prettify"> </span><span style=3D"color:#008" class=3D"m=
_6689280322255370458styled-by-prettify">true</span><span style=3D"color:#66=
0" class=3D"m_6689280322255370458styled-by-prettify">;</span><span style=3D=
"color:#000" class=3D"m_6689280322255370458styled-by-prettify"><br></span><=
span style=3D"color:#008" class=3D"m_6689280322255370458styled-by-prettify"=
>template</span><u></u><span style=3D"color:#000" class=3D"m_66892803222553=
70458styled-by-prettify"> </span><span style=3D"color:#660" class=3D"m_6689=
280322255370458styled-by-prettify"><</span><span style=3D"color:#008" cl=
ass=3D"m_6689280322255370458styled-by-prettify">typename</span><span style=
=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"> T</span>=
<span style=3D"color:#660" class=3D"m_6689280322255370458styled-by-prettify=
">></span><span style=3D"color:#000" class=3D"m_6689280322255370458style=
d-by-prettify"> </span><span style=3D"color:#008" class=3D"m_66892803222553=
70458styled-by-prettify">concept</span><span style=3D"color:#000" class=3D"=
m_6689280322255370458styled-by-prettify"> </span><span style=3D"color:#008"=
class=3D"m_6689280322255370458styled-by-prettify">bool</span><span style=
=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"> D </span=
><span style=3D"color:#660" class=3D"m_6689280322255370458styled-by-prettif=
y">=3D</span><span style=3D"color:#000" class=3D"m_6689280322255370458style=
d-by-prettify"> </span><span style=3D"color:#008" class=3D"m_66892803222553=
70458styled-by-prettify">false</span><span style=3D"color:#660" class=3D"m_=
6689280322255370458styled-by-prettify">;</span><span style=3D"color:#000" c=
lass=3D"m_6689280322255370458styled-by-prettify"><br>C z1 </span><span styl=
e=3D"color:#660" class=3D"m_6689280322255370458styled-by-prettify">=3D</spa=
n><span style=3D"color:#000" class=3D"m_6689280322255370458styled-by-pretti=
fy"> </span><span style=3D"color:#066" class=3D"m_6689280322255370458styled=
-by-prettify">0</span><span style=3D"color:#660" class=3D"m_668928032225537=
0458styled-by-prettify">;</span><span style=3D"color:#000" class=3D"m_66892=
80322255370458styled-by-prettify"> </span><span style=3D"color:#800" class=
=3D"m_6689280322255370458styled-by-prettify">// OK: z1 has type int</span><=
span style=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"=
><br>D z2 </span><span style=3D"color:#660" class=3D"m_6689280322255370458s=
tyled-by-prettify">=3D</span><span style=3D"color:#000" class=3D"m_66892803=
22255370458styled-by-prettify"> </span><span style=3D"color:#066" class=3D"=
m_6689280322255370458styled-by-prettify">0</span><span style=3D"color:#660"=
class=3D"m_6689280322255370458styled-by-prettify">;</span><span style=3D"c=
olor:#000" class=3D"m_6689280322255370458styled-by-prettify"> </span><span =
style=3D"color:#800" class=3D"m_6689280322255370458styled-by-prettify">// e=
rror: constraints not satisfied</span><span style=3D"color:#000" class=3D"m=
_6689280322255370458styled-by-prettify"><br>C cf1</span><span style=3D"colo=
r:#660" class=3D"m_6689280322255370458styled-by-prettify">()</span><span st=
yle=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"> </spa=
n><span style=3D"color:#660" class=3D"m_6689280322255370458styled-by-pretti=
fy">{</span><span style=3D"color:#000" class=3D"m_6689280322255370458styled=
-by-prettify"> </span><span style=3D"color:#008" class=3D"m_668928032225537=
0458styled-by-prettify">return</span><span style=3D"color:#000" class=3D"m_=
6689280322255370458styled-by-prettify"> </span><span style=3D"color:#066" c=
lass=3D"m_6689280322255370458styled-by-prettify">0.0</span><span style=3D"c=
olor:#660" class=3D"m_6689280322255370458styled-by-prettify">;</span><span =
style=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"> </s=
pan><span style=3D"color:#660" class=3D"m_6689280322255370458styled-by-pret=
tify">};</span><span style=3D"color:#000" class=3D"m_6689280322255370458sty=
led-by-prettify"> </span><span style=3D"color:#800" class=3D"m_668928032225=
5370458styled-by-prettify">// OK: cf1 returns double</span><span style=3D"c=
olor:#000" class=3D"m_6689280322255370458styled-by-prettify"><br>D cf2</spa=
n><span style=3D"color:#660" class=3D"m_6689280322255370458styled-by-pretti=
fy">()</span><span style=3D"color:#000" class=3D"m_6689280322255370458style=
d-by-prettify"> </span><span style=3D"color:#660" class=3D"m_66892803222553=
70458styled-by-prettify">{</span><span style=3D"color:#000" class=3D"m_6689=
280322255370458styled-by-prettify"> </span><span style=3D"color:#008" class=
=3D"m_6689280322255370458styled-by-prettify">return</span><span style=3D"co=
lor:#000" class=3D"m_6689280322255370458styled-by-prettify"> </span><span s=
tyle=3D"color:#066" class=3D"m_6689280322255370458styled-by-prettify">0.0</=
span><span style=3D"color:#660" class=3D"m_6689280322255370458styled-by-pre=
ttify">;</span><span style=3D"color:#000" class=3D"m_6689280322255370458sty=
led-by-prettify"> </span><span style=3D"color:#660" class=3D"m_668928032225=
5370458styled-by-prettify">};</span><span style=3D"color:#000" class=3D"m_6=
689280322255370458styled-by-prettify"> </span><span style=3D"color:#800" cl=
ass=3D"m_6689280322255370458styled-by-prettify">// error: constraints not s=
atisfied</span><span style=3D"color:#000" class=3D"m_6689280322255370458sty=
led-by-prettify"><br></span><span style=3D"color:#008" class=3D"m_668928032=
2255370458styled-by-prettify">auto</span><span style=3D"color:#000" class=
=3D"m_6689280322255370458styled-by-prettify"> cf3</span><span style=3D"colo=
r:#660" class=3D"m_6689280322255370458styled-by-prettify">()</span><span st=
yle=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"> </spa=
n><span style=3D"color:#660" class=3D"m_6689280322255370458styled-by-pretti=
fy">-></span><span style=3D"color:#000" class=3D"m_6689280322255370458st=
yled-by-prettify"> C</span><span style=3D"color:#660" class=3D"m_6689280322=
255370458styled-by-prettify">;</span><span style=3D"color:#000" class=3D"m_=
6689280322255370458styled-by-prettify"> </span><span style=3D"color:#800" c=
lass=3D"m_6689280322255370458styled-by-prettify">// OK: cf3=E2=80=99s retur=
n type will be deduced when it is defined</span><u></u><u></u><span style=
=3D"color:#000" class=3D"m_6689280322255370458styled-by-prettify"><br></spa=
n></div></code></div><br><br></div></div><div class=3D"quoted-text">
<p></p>
-- <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/lzIEK6_-J84/unsubscribe" target=3D"_blan=
k">https://groups.google.com/a/<wbr>isocpp.org/d/topic/std-<wbr>proposals/l=
zIEK6_-J84/<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></div>
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/65ad7b18-0aa5-49a8-bd19-1887cc8b7649%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/<wbr>isocpp.org/d/msgid/std-<wbr>proposals/65ad=
7b18-0aa5-49a8-<wbr>bd19-1887cc8b7649%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/CAEwx-OsVLrYQkGxLBmwoGvvCSRYPofihR6Xa=
9R1P-F3aEa1ucw%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAEwx-OsVLrYQkGxL=
BmwoGvvCSRYPofihR6Xa9R1P-F3aEa1ucw%40mail.gmail.com</a>.<br />
--001a114274ba8a8a25055460a7de--
.