Topic: Add implicit virtual destructors to class using
Author: Tony V E <tvaneerd@gmail.com>
Date: Thu, 21 Mar 2019 17:50:54 -0400
Raw View
--00000000000064684e0584a1bca1
Content-Type: text/plain; charset="UTF-8"
If your class has a virtual destructor it is probably polymorphic
(alternatively, if it is not polymorphic, don't give it a virtual
destructor).
If your class is polymorphic, you probably don't want it to have a copy
constructor, as the copy probably isn't going to copy the polymorphic (ie
most-derived) parts.
Now, some people believe (and teach) that all classes should have virtual
destructors, in case someone wants to later derive from them.
Those people are wrong. Classes should be designed for polymorphism (or
not); it is not a post-class decision.
You should (typically) only have a virtual destructor if you have other
virtual functions, which you have because you want polymorphism.
(What the standard _should_ do (but would break code and/or ABI somewhere)
is to give you a virtual destructor automatically when you have virtual
functions.)
So, I don't understand why you want virtual destructor AND rule of zero
together.
Tony
On Thu, Mar 21, 2019 at 5:29 PM Nathan Oliver <nathanoliver60097@gmail.com>
wrote:
> Today I encountered the following code on Stack Overflow
> <https://stackoverflow.com/questions/55288708/c-copy-constructor-called-at-return> which
> will not compile as it tries to copy the return value.
>
> struct B {};
>
> struct A{
> std::unique_ptr<B> x;
> virtual ~A() = default;
> };
>
> A f() {
> A tmp;
> return tmp;
> }
>
>
> The problem here is that since the user declared the destructor so it
> could be virtual, it removed the implicitly generated move operations.
> This can be solved by explicitly defaulting the operations, which adds code
> you have to type which introduces more places to create a bug, or you can
> inherit from a class that only has a virtual destructor. This is less
> prone to bugs but it is still writing boiler plate to add just to get a
> default virtual destructor. I think it would be nice to have the ability
> to mark A in such a way that the compiler can make its implicitly generated
> destructor default. Something along the lines of
>
> virtual struct A {
> std::unique_ptr<B> x;
> };
>
>
> Would be nice to be able to do to tell the compiler to generate a virtual
> destructor and allows you to follow the rule of zero.
>
> --
> 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/9a1898a8-77dc-42a3-8b62-67f49dcaaac6%40isocpp.org
> <https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/9a1898a8-77dc-42a3-8b62-67f49dcaaac6%40isocpp.org?utm_medium=email&utm_source=footer>
> .
>
--
Be seeing you,
Tony
--
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/CAOHCbiuSyzHWo6krbmo_wjGikzYAV_3LN2UEPfZC1QSczGD_tQ%40mail.gmail.com.
--00000000000064684e0584a1bca1
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div>If your class has a virtual destructor it is probably=
polymorphic (alternatively, if it is not polymorphic, don't give it a =
virtual destructor).</div><div>If your class is polymorphic, you probably d=
on't want it to have a copy constructor, as the copy probably isn't=
going to copy the polymorphic (ie most-derived) parts.</div><div><br></div=
><div>Now, some people believe (and teach) that all classes should have vir=
tual destructors, in case someone wants to later derive from them.</div><di=
v>Those people are wrong. Classes should be designed for polymorphism (or n=
ot); it is not a post-class decision.<br></div><div><br></div><div>You shou=
ld (typically) only have a virtual destructor if you have other virtual fun=
ctions, which you have because you want polymorphism.</div><div>(What the s=
tandard _should_ do (but would break code and/or ABI somewhere) is to give =
you a virtual destructor automatically when you have virtual functions.)</d=
iv><div><br></div><div>So, I don't understand why you want virtual dest=
ructor AND rule of zero together.</div><div>Tony<br></div><div><br></div></=
div><br><div class=3D"gmail_quote"><div dir=3D"ltr" class=3D"gmail_attr">On=
Thu, Mar 21, 2019 at 5:29 PM Nathan Oliver <<a href=3D"mailto:nathanoli=
ver60097@gmail.com">nathanoliver60097@gmail.com</a>> wrote:<br></div><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">Today I enc=
ountered the following code on <a href=3D"https://stackoverflow.com/questio=
ns/55288708/c-copy-constructor-called-at-return" target=3D"_blank">Stack Ov=
erflow</a>=C2=A0which will not compile as it tries to copy the return value=
..<div><br></div><div><div class=3D"gmail-m_-2015421747086606498prettyprint"=
style=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);b=
order-style:solid;border-width:1px"><code class=3D"gmail-m_-201542174708660=
6498prettyprint"><div class=3D"gmail-m_-2015421747086606498subprettyprint">=
<pre title=3D"double-click to select all" class=3D"gmail-m_-201542174708660=
6498lang-cpp gmail-m_-2015421747086606498prettyprint gmail-m_-2015421747086=
606498prettyprinted" style=3D"padding:12px 8px;font-variant-numeric:inherit=
;font-variant-east-asian:inherit;font-stretch:inherit;line-height:inherit;f=
ont-family:Consolas,Menlo,Monaco,"Lucida Console","Liberatio=
n Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono&qu=
ot;,"Courier New",monospace,sans-serif;vertical-align:baseline;bo=
x-sizing:inherit;width:auto;max-height:600px;overflow:auto;background-color=
:rgb(239,240,241);border-radius:3px;color:rgb(57,51,24)"><pre title=3D"doub=
le-click to select all" class=3D"gmail-m_-2015421747086606498lang-cpp gmail=
-m_-2015421747086606498prettyprint gmail-m_-2015421747086606498prettyprinte=
d" style=3D"padding:12px 8px;font-variant-numeric:inherit;font-variant-east=
-asian:inherit;font-stretch:inherit;line-height:inherit;font-family:Consola=
s,Menlo,Monaco,"Lucida Console","Liberation Mono","=
;DejaVu Sans Mono","Bitstream Vera Sans Mono","Courier =
New",monospace,sans-serif;vertical-align:baseline;box-sizing:inherit;w=
idth:auto;max-height:600px;overflow:auto;border-radius:3px"><code style=3D"=
font-style:inherit;font-variant:inherit;font-weight:inherit;font-stretch:in=
herit;line-height:inherit;font-family:Consolas,Menlo,Monaco,"Lucida Co=
nsole","Liberation Mono","DejaVu Sans Mono","=
Bitstream Vera Sans Mono","Courier New",monospace,sans-serif=
;vertical-align:baseline;box-sizing:inherit;white-space:inherit"><span styl=
e=3D"color:rgb(0,0,136)" class=3D"gmail-m_-2015421747086606498styled-by-pre=
ttify">struct</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015=
421747086606498styled-by-prettify"> B </span><span style=3D"color:rgb(102,1=
02,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify">{};</span><=
span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled=
-by-prettify"><br><br></span><span style=3D"color:rgb(0,0,136)" class=3D"gm=
ail-m_-2015421747086606498styled-by-prettify">struct</span><span style=3D"c=
olor:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"> =
A</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-201542174708=
6606498styled-by-prettify">{</span><span style=3D"color:rgb(0,0,0)" class=
=3D"gmail-m_-2015421747086606498styled-by-prettify"><br>=C2=A0 =C2=A0 std</=
span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-201542174708660=
6498styled-by-prettify">::</span><span style=3D"color:rgb(0,0,0)" class=3D"=
gmail-m_-2015421747086606498styled-by-prettify">unique_ptr</span><span styl=
e=3D"color:rgb(102,102,0)" class=3D"gmail-m_-2015421747086606498styled-by-p=
rettify"><</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015=
421747086606498styled-by-prettify">B</span><span style=3D"color:rgb(102,102=
,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify">></span><s=
pan style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-=
by-prettify"> x</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m=
_-2015421747086606498styled-by-prettify">;</span><span style=3D"color:rgb(0=
,0,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"><br>=C2=A0 =
=C2=A0 </span><span style=3D"color:rgb(0,0,136)" class=3D"gmail-m_-20154217=
47086606498styled-by-prettify">virtual</span><span style=3D"color:rgb(0,0,0=
)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"> </span><span s=
tyle=3D"color:rgb(102,102,0)" class=3D"gmail-m_-2015421747086606498styled-b=
y-prettify">~</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015=
421747086606498styled-by-prettify">A</span><span style=3D"color:rgb(102,102=
,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify">()</span><spa=
n style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-by=
-prettify"> </span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-2=
015421747086606498styled-by-prettify">=3D</span><span style=3D"color:rgb(0,=
0,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"> </span><spa=
n style=3D"color:rgb(0,0,136)" class=3D"gmail-m_-2015421747086606498styled-=
by-prettify">default</span><span style=3D"color:rgb(102,102,0)" class=3D"gm=
ail-m_-2015421747086606498styled-by-prettify">;</span><span style=3D"color:=
rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"><br></=
span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-201542174708660=
6498styled-by-prettify">};</span><span style=3D"color:rgb(0,0,0)" class=3D"=
gmail-m_-2015421747086606498styled-by-prettify"><br><br>A f</span><span sty=
le=3D"color:rgb(102,102,0)" class=3D"gmail-m_-2015421747086606498styled-by-=
prettify">()</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-20154=
21747086606498styled-by-prettify"> </span><span style=3D"color:rgb(102,102,=
0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify">{</span><span =
style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-by-p=
rettify"><br>=C2=A0 =C2=A0 A tmp</span><span style=3D"color:rgb(102,102,0)"=
class=3D"gmail-m_-2015421747086606498styled-by-prettify">;</span><span sty=
le=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-by-pret=
tify"><br>=C2=A0 =C2=A0 </span><span style=3D"color:rgb(0,0,136)" class=3D"=
gmail-m_-2015421747086606498styled-by-prettify">return</span><span style=3D=
"color:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"=
> tmp</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-20154217=
47086606498styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" cla=
ss=3D"gmail-m_-2015421747086606498styled-by-prettify"><br></span><span styl=
e=3D"color:rgb(102,102,0)" class=3D"gmail-m_-2015421747086606498styled-by-p=
rettify">}</span></code></pre></pre></div></code></div><br>The problem here=
is that since the user declared the destructor so it could be virtual, it =
removed the implicitly generated move operations.=C2=A0 This can be solved =
by explicitly defaulting the operations, which adds code you have to type w=
hich introduces more places to create a bug, or you can inherit from a clas=
s that only has a virtual destructor.=C2=A0 This is less prone to bugs but =
it is still writing boiler plate to add just to get a default virtual destr=
uctor.=C2=A0 I think it would be nice to have the ability to mark A in such=
a way that the compiler can make its implicitly generated destructor defau=
lt.=C2=A0 Something along the lines of<br></div><div><br></div><div><div cl=
ass=3D"gmail-m_-2015421747086606498prettyprint" style=3D"background-color:r=
gb(250,250,250);border-color:rgb(187,187,187);border-style:solid;border-wid=
th:1px"><code class=3D"gmail-m_-2015421747086606498prettyprint"><div class=
=3D"gmail-m_-2015421747086606498subprettyprint"><pre title=3D"double-click =
to select all" class=3D"gmail-m_-2015421747086606498lang-cpp gmail-m_-20154=
21747086606498prettyprint gmail-m_-2015421747086606498prettyprinted" style=
=3D"padding:12px 8px;font-variant-numeric:inherit;font-variant-east-asian:i=
nherit;font-stretch:inherit;line-height:inherit;font-family:Consolas,Menlo,=
Monaco,"Lucida Console","Liberation Mono","DejaVu =
Sans Mono","Bitstream Vera Sans Mono","Courier New"=
;,monospace,sans-serif;vertical-align:baseline;box-sizing:inherit;width:aut=
o;max-height:600px;overflow:auto;background-color:rgb(239,240,241);border-r=
adius:3px;color:rgb(57,51,24)"><code style=3D"font-style:inherit;font-varia=
nt:inherit;font-weight:inherit;font-stretch:inherit;line-height:inherit;fon=
t-family:Consolas,Menlo,Monaco,"Lucida Console","Liberation =
Mono","DejaVu Sans Mono","Bitstream Vera Sans Mono"=
;,"Courier New",monospace,sans-serif;vertical-align:baseline;box-=
sizing:inherit;white-space:inherit"><span style=3D"color:rgb(0,0,136)" clas=
s=3D"gmail-m_-2015421747086606498styled-by-prettify">virtual</span><span st=
yle=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-by-pre=
ttify"> </span><span style=3D"color:rgb(0,0,136)" class=3D"gmail-m_-2015421=
747086606498styled-by-prettify">struct</span><span style=3D"color:rgb(0,0,0=
)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"> A </span><span=
style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-2015421747086606498styled=
-by-prettify">{</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-20=
15421747086606498styled-by-prettify"><br>=C2=A0 =C2=A0 std</span><span styl=
e=3D"color:rgb(102,102,0)" class=3D"gmail-m_-2015421747086606498styled-by-p=
rettify">::</span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-201542=
1747086606498styled-by-prettify">unique_ptr</span><span style=3D"color:rgb(=
102,102,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"><</=
span><span style=3D"color:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498=
styled-by-prettify">B</span><span style=3D"color:rgb(102,102,0)" class=3D"g=
mail-m_-2015421747086606498styled-by-prettify">></span><span style=3D"co=
lor:rgb(0,0,0)" class=3D"gmail-m_-2015421747086606498styled-by-prettify"> x=
</span><span style=3D"color:rgb(102,102,0)" class=3D"gmail-m_-2015421747086=
606498styled-by-prettify">;</span><span style=3D"color:rgb(0,0,0)" class=3D=
"gmail-m_-2015421747086606498styled-by-prettify"><br></span><span style=3D"=
color:rgb(102,102,0)" class=3D"gmail-m_-2015421747086606498styled-by-pretti=
fy">};</span></code></pre></div></code></div><br>Would be nice to be able t=
o do to tell the compiler to generate a virtual destructor and allows you t=
o follow the rule of zero.</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" target=3D"_=
blank">std-proposals+unsubscribe@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/9a1898a8-77dc-42a3-8b62-67f49dcaaac6%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter" target=3D"_blank">=
https://groups.google.com/a/isocpp.org/d/msgid/std-proposals/9a1898a8-77dc-=
42a3-8b62-67f49dcaaac6%40isocpp.org</a>.<br>
</blockquote></div><br clear=3D"all"><br>-- <br><div dir=3D"ltr" class=3D"g=
mail_signature"><div dir=3D"ltr"><div>Be seeing you,<br></div>Tony<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/CAOHCbiuSyzHWo6krbmo_wjGikzYAV_3LN2UE=
PfZC1QSczGD_tQ%40mail.gmail.com?utm_medium=3Demail&utm_source=3Dfooter">htt=
ps://groups.google.com/a/isocpp.org/d/msgid/std-proposals/CAOHCbiuSyzHWo6kr=
bmo_wjGikzYAV_3LN2UEPfZC1QSczGD_tQ%40mail.gmail.com</a>.<br />
--00000000000064684e0584a1bca1--
.
Author: Balog Pal <pasa@lib.hu>
Date: Tue, 26 Mar 2019 03:52:46 -0700 (PDT)
Raw View
------=_Part_2238_232173424.1553597566206
Content-Type: multipart/alternative;
boundary="----=_Part_2239_645842999.1553597566206"
------=_Part_2239_645842999.1553597566206
Content-Type: text/plain; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
2019. m=C3=A1rcius 21., cs=C3=BCt=C3=B6rt=C3=B6k 22:29:54 UTC+1 id=C5=91pon=
tban Nathan Oliver a=20
k=C3=B6vetkez=C5=91t =C3=ADrta:=20
> The problem here is that since the user declared the destructor so it=20
> could be virtual, it removed the implicitly generated move operations. =
=20
> This can be solved by explicitly defaulting the operations, which adds co=
de=20
> you have to type which introduces more places to create a bug, or you can=
=20
> inherit from a class that only has a virtual destructor. This is less=20
> prone to bugs but it is still writing boiler plate to add just to get a=
=20
> default virtual destructor. I think it would be nice to have the ability=
=20
> to mark A in such a way that the compiler can make its implicitly generat=
ed=20
> destructor default.=20
>
Yeah, it is pretty bad that the rules have 'user-declared' in many places=
=20
and if you use =3Ddefault it is still counts as user-declared with all the=
=20
unwanted consequences. But it will unlikely change in general. And=20
standard's rules about generating virtual dtor seeing virtual functions or=
=20
or the change you seek will not change due to silently changing the meaning=
=20
of too much code out there. Especially for the sake of RARE cases, that=20
are easy to solve too.=20
Instead of declaring the virtual dtor directly, create an empty base class=
=20
VirtualDtor with just the virtual dtor and the 4 other auto functions=20
=3Ddefault. And inherit from that, it giver you all the desired functionali=
ty.
--=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/4681450e-2964-4ac4-b0ef-34fa9ad4c10f%40isocpp.or=
g.
------=_Part_2239_645842999.1553597566206
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>2019. m=C3=A1rcius 21., cs=C3=BCt=C3=B6rt=C3=B6k 2=
2:29:54 UTC+1 id=C5=91pontban Nathan Oliver a k=C3=B6vetkez=C5=91t =C3=ADrt=
a: <br><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>T=
he problem here is that since the user declared the destructor so it could =
be virtual, it removed the implicitly generated move operations.=C2=A0 This=
can be solved by explicitly defaulting the operations, which adds code you=
have to type which introduces more places to create a bug, or you can inhe=
rit from a class that only has a virtual destructor.=C2=A0 This is less pro=
ne to bugs but it is still writing boiler plate to add just to get a defaul=
t virtual destructor.=C2=A0 I think it would be nice to have the ability to=
mark A in such a way that the compiler can make its implicitly generated d=
estructor default.=C2=A0</div></div></blockquote><div><br></div><div>Yeah, =
it is pretty bad that the rules have 'user-declared' in many places=
and if you use =3Ddefault it is still counts as user-declared with all the=
unwanted consequences.=C2=A0=C2=A0 But it will unlikely change in general.=
And standard's rules about generating virtual dtor seeing virtual func=
tions or or the change you seek will not change due to silently changing th=
e meaning of too much code out there.=C2=A0 Especially for the sake of RARE=
cases, that are easy to solve too. <br></div><div><br></div><div>Instead o=
f declaring the virtual dtor directly, create an empty base class VirtualDt=
or with just the virtual dtor and the 4 other auto functions =3Ddefault. An=
d inherit from that, it giver you all the desired functionality.<br></div><=
div><br></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/4681450e-2964-4ac4-b0ef-34fa9ad4c10f%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/4681450e-2964-4ac4-b0ef-34fa9ad4c10f=
%40isocpp.org</a>.<br />
------=_Part_2239_645842999.1553597566206--
------=_Part_2238_232173424.1553597566206--
.