Topic: Invalid possible implementation of
Author: Alexey Mamontov <caracrist@gmail.com>
Date: Sun, 25 Sep 2016 02:36:28 -0700 (PDT)
Raw View
------=_Part_507_644382150.1474796188165
Content-Type: multipart/alternative;
boundary="----=_Part_508_1277646443.1474796188167"
------=_Part_508_1277646443.1474796188167
Content-Type: text/plain; charset=UTF-8
Here it is: http://en.cppreference.com/w/cpp/types/is_move_constructible
template<class T>
struct is_move_constructible :
*std::is_constructible*
<http://en.cppreference.com/w/cpp/types/is_constructible><T, typename
*std::add_rvalue_reference*
<http://en.cppreference.com/w/cpp/types/add_reference><T>::type> {};
The problem is that in this case it will be true for any class which is
copy constructible, which is not the desired result. For example I would
like to implement something like this:
template<typename T, bool move_constructible = std::is_move_constructible<T
>::value>
struct choose_best_input_modifier;
template<typename T>
struct choose_best_input_modifier<T, true>
{
typedef T&& type;
};
template<typename T>
struct choose_best_input_modifier<T, false>
{
typedef const T& type;
};
#define MOVED(...) choose_best_input_modifier<__VA_ARGS__>::type
#define MOVED_T(...) typename choose_best_input_modifier<__VA_ARGS__>::type //
the typename issue, just another issue, but ok...
template<typename T>
void func(MOVED_T(T) x) // T&& if available or const T& otherwise
{
cout << typeid(x).name();
}
void func2(MOVED(string) x) // string&&
{
cout << typeid(x).name();
}
void funcNM(MOVED(NM) nm) // const NM&
{
cout << typeid(nm).name();
}
But I can't...
--
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/ba2ec31e-fcfa-47d9-8070-8b748b00a0dd%40isocpp.org.
------=_Part_508_1277646443.1474796188167
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><div><span class=3D"kw1"><font color=3D"#0000dd"><br></fon=
t></span></div><div><span class=3D"kw1"><font color=3D"#0000dd"><font color=
=3D"#000000">Here it is:</font> <a href=3D"http://en.cppreference.com/w/cpp=
/types/is_move_constructible">http://en.cppreference.com/w/cpp/types/is_mov=
e_constructible</a></font></span></div><div><span class=3D"kw1"><font color=
=3D"#0000dd"><br></font></span></div><div><span class=3D"kw1"><font color=
=3D"#0000dd">template</font></span><span class=3D"sy1"><font color=3D"#0000=
80"><</font></span><span class=3D"kw1"><font color=3D"#0000dd">class</fo=
nt></span> T<span class=3D"sy1"><font color=3D"#000080">></font></span><=
br><span class=3D"kw1"><font color=3D"#0000dd">struct</font></span> is_move=
_constructible <span class=3D"sy4"><font color=3D"#008080">:</font></span><=
br>=C2=A0=C2=A0=C2=A0=C2=A0=C2=A0 <a href=3D"http://en.cppreference.com/w/c=
pp/types/is_constructible"><span class=3D"kw509"><u><font color=3D"#0066cc"=
>std::<span class=3D"me2">is_constructible</span></font></u></span></a><spa=
n class=3D"sy1"><font color=3D"#000080"><</font></span>T, <span class=3D=
"kw1"><font color=3D"#0000dd">typename</font></span> <a href=3D"http://en.c=
ppreference.com/w/cpp/types/add_reference"><span class=3D"kw581"><u><font c=
olor=3D"#0066cc">std::<span class=3D"me2">add_rvalue_reference</span></font=
></u></span></a><span class=3D"sy1"><font color=3D"#000080"><</font></sp=
an>T<span class=3D"sy1"><font color=3D"#000080">></font></span><span cla=
ss=3D"sy4"><font color=3D"#008080">::</font></span><span class=3D"me2">type=
</span><span class=3D"sy1"><font color=3D"#000080">></font></span> <font=
color=3D"#008000"><span class=3D"br0">{</span><span class=3D"br0">}</span>=
</font><span class=3D"sy4"><font color=3D"#008080">;</font></span></div><di=
v><span class=3D"sy4"><font color=3D"#008080"><br></font></span></div><div>=
<span class=3D"sy4"><font color=3D"#008080">The problem is that in this cas=
e it will be true for any class which is copy constructible, which is not t=
he desired result. For example I would like to implement something like thi=
s:</font></span></div><div><span class=3D"sy4"><font color=3D"#008080"><br>=
</font></span></div><div><span class=3D"sy4"><font color=3D"#008080"><p><fo=
nt face=3D"Consolas" size=3D"2"><font face=3D"Consolas" size=3D"2"> </font>=
</font><font color=3D"#0000ff" face=3D"Consolas" size=3D"2"><font color=3D"=
#0000ff" face=3D"Consolas" size=3D"2"><font color=3D"#0000ff" face=3D"Conso=
las" size=3D"2"></font></font></font></p><div class=3D"prettyprint" style=
=3D"border: 1px solid rgb(187, 187, 187); border-image: none; -ms-word-wrap=
: break-word; background-color: rgb(250, 250, 250);"><code class=3D"prettyp=
rint"><div class=3D"subprettyprint"><span class=3D"styled-by-prettify" styl=
e=3D"color: rgb(0, 0, 0);">=C2=A0</span><span class=3D"styled-by-prettify" =
style=3D"color: rgb(0, 0, 136);">template</span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(102, 102, 0);"><</span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(0, 0, 136);">typename</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> T</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">,</span><span cl=
ass=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span cla=
ss=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">bool</span><span=
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> move_construc=
tible </span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 10=
2, 0);">=3D</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0,=
0, 0);"> std</span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
102, 102, 0);">::</span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(0, 0, 0);">is_move_constructible</span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(102, 102, 0);"><</span><span class=3D"styled-by-p=
rettify" style=3D"color: rgb(0, 0, 0);">T</span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(102, 102, 0);">>::</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(0, 0, 0);">value</span><span class=3D"s=
tyled-by-prettify" style=3D"color: rgb(102, 102, 0);">></span><span clas=
s=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br>=C2=A0</span><s=
pan class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">struct</s=
pan><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> choo=
se_best_input_modifier</span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(102, 102, 0);">;</span><span class=3D"styled-by-prettify" style=3D=
"color: rgb(0, 0, 0);"> <br>=C2=A0</span><span class=3D"styled-by-prettify"=
style=3D"color: rgb(0, 0, 136);">template</span><span class=3D"styled-by-p=
rettify" style=3D"color: rgb(102, 102, 0);"><</span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(0, 0, 136);">typename</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> T</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">></span><span=
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> <br>=C2=A0</s=
pan><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">str=
uct</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"=
> choose_best_input_modifier</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(102, 102, 0);"><</span><span class=3D"styled-by-prettify"=
style=3D"color: rgb(0, 0, 0);">T</span><span class=3D"styled-by-prettify" =
style=3D"color: rgb(102, 102, 0);">,</span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 136);">true</span><span class=3D"styled-by-pret=
tify" style=3D"color: rgb(102, 102, 0);">></span><span class=3D"styled-b=
y-prettify" style=3D"color: rgb(0, 0, 0);"> <br>=C2=A0</span><span class=3D=
"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">{</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> <br>=C2=A0 =C2=A0</=
span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">ty=
pedef</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0)=
;"> T</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102=
, 0);">&&</span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(0, 0, 0);"> type</span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(102, 102, 0);">;</span><span class=3D"styled-by-prettify" style=3D"c=
olor: rgb(0, 0, 0);"> <br>=C2=A0</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(102, 102, 0);">};</span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(0, 0, 0);"> <br><br>=C2=A0</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(0, 0, 136);">template</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"><</span><span=
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">typename</sp=
an><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> T</sp=
an><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">&g=
t;</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);">=
<br>=C2=A0</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0,=
0, 136);">struct</span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(0, 0, 0);"> choose_best_input_modifier</span><span class=3D"styled-by-p=
rettify" style=3D"color: rgb(102, 102, 0);"><</span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(0, 0, 0);">T</span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(102, 102, 0);">,</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(0, 0, 136);">false</span><span class=3D=
"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">></span><span cl=
ass=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> <br>=C2=A0</span=
><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">{</s=
pan><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> <br>=
=C2=A0 =C2=A0</span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
0, 0, 136);">typedef</span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(0, 0, 136);">const</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(0, 0, 0);"> T</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(102, 102, 0);">&</span><span class=3D"styled-by-prettify" st=
yle=3D"color: rgb(0, 0, 0);"> type</span><span class=3D"styled-by-prettify"=
style=3D"color: rgb(102, 102, 0);">;</span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(0, 0, 0);"> <br>=C2=A0</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(102, 102, 0);">};</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(0, 0, 0);"><br><br></span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(136, 0, 0);">#define</span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> MOVED</span>=
<span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">(...)=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> c=
hoose_best_input_modifier</span><span class=3D"styled-by-prettify" style=3D=
"color: rgb(102, 102, 0);"><</span><span class=3D"styled-by-prettify" st=
yle=3D"color: rgb(0, 0, 0);">__VA_ARGS__</span><span class=3D"styled-by-pre=
ttify" style=3D"color: rgb(102, 102, 0);">>::</span><span class=3D"style=
d-by-prettify" style=3D"color: rgb(0, 0, 0);">type<br></span><span class=3D=
"styled-by-prettify" style=3D"color: rgb(136, 0, 0);">#define</span><span c=
lass=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> MOVED_T</span><=
span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">(...)<=
/span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </=
span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">ty=
pename</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0=
);"> choose_best_input_modifier</span><span class=3D"styled-by-prettify" st=
yle=3D"color: rgb(102, 102, 0);"><</span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(0, 0, 0);">__VA_ARGS__</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(102, 102, 0);">>::</span><span class=3D=
"styled-by-prettify" style=3D"color: rgb(0, 0, 0);">type </span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(136, 0, 0);">// the typename is=
sue, just another issue, but ok...</span></div></code></div><font face=3D"C=
onsolas" size=3D"2"><font face=3D"Consolas" size=3D"2"><font face=3D"Consol=
as" size=3D"2"><font face=3D"Consolas" size=3D"2"><font color=3D"#008000" f=
ace=3D"Consolas" size=3D"2"><font color=3D"#008000" face=3D"Consolas" size=
=3D"2"><font color=3D"#008000" face=3D"Consolas" size=3D"2"><p><br></p><div=
class=3D"prettyprint" style=3D"border: 1px solid rgb(187, 187, 187); borde=
r-image: none; -ms-word-wrap: break-word; background-color: rgb(250, 250, 2=
50);"><code class=3D"prettyprint"><div class=3D"subprettyprint"><span class=
=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">template</span><sp=
an class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"><</sp=
an><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">type=
name</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);=
"> T</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102,=
0);">></span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, =
0, 0);"><br></span><span class=3D"styled-by-prettify" style=3D"color: rgb(0=
, 0, 136);">void</span><span class=3D"styled-by-prettify" style=3D"color: r=
gb(0, 0, 0);"> func</span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(0, 0, 0);">MOVED_T</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" st=
yle=3D"color: rgb(0, 0, 0);">T</span><span class=3D"styled-by-prettify" sty=
le=3D"color: rgb(102, 102, 0);">)</span><span class=3D"styled-by-prettify" =
style=3D"color: rgb(0, 0, 0);"> x</span><span class=3D"styled-by-prettify" =
style=3D"color: rgb(102, 102, 0);">)</span><span class=3D"styled-by-prettif=
y" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(136, 0, 0);">// T&& if available or const T&a=
mp; otherwise</span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
0, 0, 0);"><br></span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(102, 102, 0);">{</span><span class=3D"styled-by-prettify" style=3D"color:=
rgb(0, 0, 0);"><br>=C2=A0 cout </span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(102, 102, 0);"><<</span><span class=3D"styled-by-p=
rettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(0, 0, 136);">typeid</span><span class=3D"styled=
-by-prettify" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"sty=
led-by-prettify" style=3D"color: rgb(0, 0, 0);">x</span><span class=3D"styl=
ed-by-prettify" style=3D"color: rgb(102, 102, 0);">).</span><span class=3D"=
styled-by-prettify" style=3D"color: rgb(0, 0, 0);">name</span><span class=
=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">();</span><span =
class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br></span><spa=
n class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">}</span><=
span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br></span=
><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">void</=
span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> fun=
c2</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0=
);">(</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0)=
;">MOVED</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, =
102, 0);">(</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0,=
0, 136);">string</span><span class=3D"styled-by-prettify" style=3D"color: =
rgb(102, 102, 0);">)</span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(0, 0, 0);"> x</span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(102, 102, 0);">)</span><span class=3D"styled-by-prettify" style=3D"c=
olor: rgb(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(136, 0, 0);">// string&&</span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(0, 0, 0);"><br></span><span class=3D"styled-by-=
prettify" style=3D"color: rgb(102, 102, 0);">{</span><span class=3D"styled-=
by-prettify" style=3D"color: rgb(0, 0, 0);"><br>=C2=A0 cout </span><span cl=
ass=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);"><<</spa=
n><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"> </span=
><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 136);">typeid=
</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);=
">(</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"=
>x</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0=
);">).</span><span class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0=
);">name</span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, =
102, 0);">();</span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
0, 0, 0);"><br></span><span class=3D"styled-by-prettify" style=3D"color: rg=
b(102, 102, 0);">}</span><span class=3D"styled-by-prettify" style=3D"color:=
rgb(0, 0, 0);"><br></span><span class=3D"styled-by-prettify" style=3D"colo=
r: rgb(0, 0, 136);">void</span><span class=3D"styled-by-prettify" style=3D"=
color: rgb(0, 0, 0);"> funcNM</span><span class=3D"styled-by-prettify" styl=
e=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" s=
tyle=3D"color: rgb(0, 0, 0);">MOVED</span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prett=
ify" style=3D"color: rgb(0, 0, 0);">NM</span><span class=3D"styled-by-prett=
ify" style=3D"color: rgb(102, 102, 0);">)</span><span class=3D"styled-by-pr=
ettify" style=3D"color: rgb(0, 0, 0);"> nm</span><span class=3D"styled-by-p=
rettify" style=3D"color: rgb(102, 102, 0);">)</span><span class=3D"styled-b=
y-prettify" style=3D"color: rgb(0, 0, 0);"> </span><span class=3D"styled-by=
-prettify" style=3D"color: rgb(136, 0, 0);">// const NM&</span><span cl=
ass=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br></span><span =
class=3D"styled-by-prettify" style=3D"color: rgb(102, 102, 0);">{</span><sp=
an class=3D"styled-by-prettify" style=3D"color: rgb(0, 0, 0);"><br>=C2=A0 c=
out </span><span class=3D"styled-by-prettify" style=3D"color: rgb(102, 102,=
0);"><<</span><span class=3D"styled-by-prettify" style=3D"color: rgb=
(0, 0, 0);"> </span><span class=3D"styled-by-prettify" style=3D"color: rgb(=
0, 0, 136);">typeid</span><span class=3D"styled-by-prettify" style=3D"color=
: rgb(102, 102, 0);">(</span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(0, 0, 0);">nm</span><span class=3D"styled-by-prettify" style=3D"co=
lor: rgb(102, 102, 0);">).</span><span class=3D"styled-by-prettify" style=
=3D"color: rgb(0, 0, 0);">name</span><span class=3D"styled-by-prettify" sty=
le=3D"color: rgb(102, 102, 0);">();</span><span class=3D"styled-by-prettify=
" style=3D"color: rgb(0, 0, 0);"><br></span><span class=3D"styled-by-pretti=
fy" style=3D"color: rgb(102, 102, 0);">}</span></div></code></div><font fac=
e=3D"Consolas" size=3D"2"><font face=3D"Consolas" size=3D"2"><p><font color=
=3D"#000000">But I can't...</font><br></p></font></font><div class=3D"s=
ubprettyprint"><br></div><p><br></p></font></font></font></font></font></fo=
nt></font></font><p><br></p></span></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/ba2ec31e-fcfa-47d9-8070-8b748b00a0dd%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/ba2ec31e-fcfa-47d9-8070-8b748b00a0dd=
%40isocpp.org</a>.<br />
------=_Part_508_1277646443.1474796188167--
------=_Part_507_644382150.1474796188165--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 25 Sep 2016 14:13:27 -0700 (PDT)
Raw View
------=_Part_219_302989747.1474838007223
Content-Type: multipart/alternative;
boundary="----=_Part_220_1514308043.1474838007223"
------=_Part_220_1514308043.1474838007223
Content-Type: text/plain; charset=UTF-8
On Sunday, September 25, 2016 at 5:36:28 AM UTC-4, Alexey Mamontov wrote:
>
>
> Here it is: http://en.cppreference.com/w/cpp/types/is_move_constructible
>
> template<class T>
> struct is_move_constructible :
> *std::is_constructible*
> <http://en.cppreference.com/w/cpp/types/is_constructible><T, typename
> *std::add_rvalue_reference*
> <http://en.cppreference.com/w/cpp/types/add_reference><T>::type> {};
>
> The problem is that in this case it will be true for any class which is
> copy constructible, which is not the desired result.
>
The question answered by `is_move_constructible` is whether
`A(std::move(a_val))` will compile. Since an xvalue can bind to a const
lvalue reference, that expression may provoke the calling of a copy
constructor. But that's *fine* for that purpose; it's no different from
having `is_constructible` take into account implicit conversions and such.
The question you seem to want answered is "is there a constructor with this
exact signature?" The standard library doesn't have a traits class as of
yet. Are you suggesting that we add one?
For example I would like to implement something like this:
>
This is something of an aside, but what you seem to want looks like a
really bad idea. You should not select whether to take a `const&` or a `&&`
based on whether the type in question has a move constructor. You pick it
based on what the function is actually doing with it.
If your function doesn't need modifiable access to an object, it should
take a `const&`. If you intend to copy/move from the parameter, then you
take it by value or by `&&`.
--
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/a0dca8e8-b449-49db-a3dc-c61e589e8684%40isocpp.org.
------=_Part_220_1514308043.1474838007223
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr">On Sunday, September 25, 2016 at 5:36:28 AM UTC-4, Alexey =
Mamontov 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><span><font color=3D"#0000dd"><br></font></span></div><div><span><fo=
nt color=3D"#0000dd"><font color=3D"#000000">Here it is:</font> <a href=3D"=
http://en.cppreference.com/w/cpp/types/is_move_constructible" target=3D"_bl=
ank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google.com=
/url?q\x3dhttp%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Ftypes%2Fis_move_cons=
tructible\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFd2bdtVef111NyBXIlcPas0tw=
WMg';return true;" onclick=3D"this.href=3D'http://www.google.com/ur=
l?q\x3dhttp%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Ftypes%2Fis_move_constru=
ctible\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNFd2bdtVef111NyBXIlcPas0twWMg=
';return true;">http://en.cppreference.com/w/<wbr>cpp/types/is_move_<wb=
r>constructible</a></font></span></div><div><span><font color=3D"#0000dd"><=
br></font></span></div><div><span><font color=3D"#0000dd">template</font></=
span><span><font color=3D"#000080"><</font></span><span><font color=3D"#=
0000dd">class</font></span> T<span><font color=3D"#000080">></font></spa=
n><br><span><font color=3D"#0000dd">struct</font></span> is_move_constructi=
ble <span><font color=3D"#008080">:</font></span><br>=C2=A0=C2=A0=C2=A0=C2=
=A0=C2=A0 <a href=3D"http://en.cppreference.com/w/cpp/types/is_constructibl=
e" target=3D"_blank" rel=3D"nofollow" onmousedown=3D"this.href=3D'http:=
//www.google.com/url?q\x3dhttp%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Ftype=
s%2Fis_constructible\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHILvMYOWJ5uhMo=
tZO7Fj6or5MXmw';return true;" onclick=3D"this.href=3D'http://www.go=
ogle.com/url?q\x3dhttp%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Ftypes%2Fis_c=
onstructible\x26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNHILvMYOWJ5uhMotZO7Fj6o=
r5MXmw';return true;"><span><u><font color=3D"#0066cc">std::<span>is_co=
nstructible</span></font></u></span></a><span><font color=3D"#000080"><<=
/font></span>T, <span><font color=3D"#0000dd">typename</font></span> <a hre=
f=3D"http://en.cppreference.com/w/cpp/types/add_reference" target=3D"_blank=
" rel=3D"nofollow" onmousedown=3D"this.href=3D'http://www.google.com/ur=
l?q\x3dhttp%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Ftypes%2Fadd_reference\x=
26sa\x3dD\x26sntz\x3d1\x26usg\x3dAFQjCNH1A4bCZHfhTwysEh14ubLUeTf_AA';re=
turn true;" onclick=3D"this.href=3D'http://www.google.com/url?q\x3dhttp=
%3A%2F%2Fen.cppreference.com%2Fw%2Fcpp%2Ftypes%2Fadd_reference\x26sa\x3dD\x=
26sntz\x3d1\x26usg\x3dAFQjCNH1A4bCZHfhTwysEh14ubLUeTf_AA';return true;"=
><span><u><font color=3D"#0066cc">std::<span>add_rvalue_reference</span></f=
ont></u></span></a><span><font color=3D"#000080"><</font></span>T<span><=
font color=3D"#000080">></font></span><span><font color=3D"#008080">::</=
font></span><span><wbr>type</span><span><font color=3D"#000080">></font>=
</span> <font color=3D"#008000"><span>{</span><span>}</span></font><span><f=
ont color=3D"#008080">;</font></span></div><div><span><font color=3D"#00808=
0"><br></font></span></div><div><span><font color=3D"#008080">The problem i=
s that in this case it will be true for any class which is copy constructib=
le, which is not the desired result.</font></span></div></div></blockquote>=
<div><br>The question answered by `is_move_constructible` is whether `A(std=
::move(a_val))` will compile. Since an xvalue can bind to a const lvalue re=
ference, that expression may provoke the calling of a copy constructor. But=
that's <i>fine</i> for that purpose; it's no different from having=
`is_constructible` take into account implicit conversions and such.<br><br=
>The question you seem to want answered is "is there a constructor wit=
h this exact signature?" The standard library doesn't have a trait=
s class as of yet. Are you suggesting that we add one?<br><br></div><blockq=
uote 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><span><font col=
or=3D"#008080"> For example I would like to implement something like this:<=
/font></span></div></div></blockquote><div><br>This is something of an asid=
e, but what you seem to want looks like a really bad idea. You should not s=
elect whether to take a `const&` or a `&&` based on whether the=
type in question has a move constructor. You pick it based on what the fun=
ction is actually doing with it.<br><br>If your function doesn't need m=
odifiable access to an object, it should take a `const&`. If you intend=
to copy/move from the parameter, then you take it by value or by `&&am=
p;`.<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/a0dca8e8-b449-49db-a3dc-c61e589e8684%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/a0dca8e8-b449-49db-a3dc-c61e589e8684=
%40isocpp.org</a>.<br />
------=_Part_220_1514308043.1474838007223--
------=_Part_219_302989747.1474838007223--
.
Author: David Krauss <potswa@gmail.com>
Date: Mon, 26 Sep 2016 12:48:54 +0800
Raw View
--Apple-Mail=_0CFC4F3C-4A35-4FE5-A6DF-F378F7EE248B
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2016=E2=80=9309=E2=80=9325, at 5:36 PM, Alexey Mamontov <caracrist@gma=
il.com> wrote:
>=20
> The problem is that in this case it will be true for any class which is c=
opy constructible, which is not the desired result.
If you want to check whether moving is more efficient than copying, is_noth=
row_move_constructible might help. This depends on noexcept correctness of =
user-defined move constructors.
--=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/1C54C135-DFF8-4C38-90A5-E15F14D432AA%40gmail.com=
..
--Apple-Mail=_0CFC4F3C-4A35-4FE5-A6DF-F378F7EE248B
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2016=E2=80=9309=
=E2=80=9325, at 5:36 PM, Alexey Mamontov <<a href=3D"mailto:caracrist@gm=
ail.com" class=3D"">caracrist@gmail.com</a>> wrote:</div><br class=3D"Ap=
ple-interchange-newline"><div class=3D""><div style=3D"font-family: Helveti=
ca; font-size: 12px; font-style: normal; font-variant: normal; font-weight:=
normal; letter-spacing: normal; orphans: auto; text-align: start; text-ind=
ent: 0px; text-transform: none; white-space: normal; widows: auto; word-spa=
cing: 0px; -webkit-text-stroke-width: 0px;" class=3D""><span class=3D"sy4">=
<font color=3D"#008080" class=3D"">The problem is that in this case it will=
be true for any class which is copy constructible, which is not the desire=
d result.</font></span></div></div></blockquote></div><br class=3D""><div c=
lass=3D"">If you want to check whether moving is more efficient than copyin=
g, <font face=3D"Courier" class=3D"">is_nothrow_move_constructible</font> m=
ight help. This depends on <font face=3D"Courier" class=3D"">noexcept</font=
> correctness of user-defined move constructors.</div><div class=3D""><br c=
lass=3D""></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/1C54C135-DFF8-4C38-90A5-E15F14D432AA%=
40gmail.com?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/1C54C135-DFF8-4C38-90A5-E15F14D432AA%=
40gmail.com</a>.<br />
--Apple-Mail=_0CFC4F3C-4A35-4FE5-A6DF-F378F7EE248B--
.
Author: Nicol Bolas <jmckesson@gmail.com>
Date: Sun, 25 Sep 2016 22:47:51 -0700 (PDT)
Raw View
------=_Part_730_701072830.1474868871923
Content-Type: multipart/alternative;
boundary="----=_Part_731_339214849.1474868871923"
------=_Part_731_339214849.1474868871923
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
On Monday, September 26, 2016 at 12:48:52 AM UTC-4, David Krauss wrote:
>
>
> On 2016=E2=80=9309=E2=80=9325, at 5:36 PM, Alexey Mamontov <cara...@gmail=
..com=20
> <javascript:>> wrote:
>
> The problem is that in this case it will be true for any class which is=
=20
> copy constructible, which is not the desired result.
>
>
> If you want to check whether moving is more efficient than copying,=20
> is_nothrow_move_constructible might help. This depends on noexcept=20
> correctness of user-defined move constructors.
>
That would lead to dysfunctional code. Imagine a class like `std::list`,=20
but is move-only. Such a class would not be nothrow move constructible, and=
=20
it wouldn't be copy constructible. So... what do you pick?
At the end of the day, there's no way to guaranteeably know if moving is=20
more efficient than copying. However, moving will in virtually every case=
=20
be no less efficient than copying (even with `std::list`).
--=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/0bbcd911-51cd-4728-8974-0a9ae28cda94%40isocpp.or=
g.
------=_Part_731_339214849.1474868871923
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable
<div dir=3D"ltr"><br><br>On Monday, September 26, 2016 at 12:48:52 AM UTC-4=
, David Krauss wrote:<blockquote class=3D"gmail_quote" style=3D"margin: 0;m=
argin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div styl=
e=3D"word-wrap:break-word"><br><div><blockquote type=3D"cite"><div>On 2016=
=E2=80=9309=E2=80=9325, at 5:36 PM, Alexey Mamontov <<a href=3D"javascri=
pt:" target=3D"_blank" gdf-obfuscated-mailto=3D"wR_C4sCWBAAJ" rel=3D"nofoll=
ow" onmousedown=3D"this.href=3D'javascript:';return true;" onclick=
=3D"this.href=3D'javascript:';return true;">cara...@gmail.com</a>&g=
t; wrote:</div><br><div><div style=3D"font-family:Helvetica;font-size:12px;=
font-style:normal;font-variant:normal;font-weight:normal;letter-spacing:nor=
mal;text-align:start;text-indent:0px;text-transform:none;white-space:normal=
;word-spacing:0px"><span><font color=3D"#008080">The problem is that in thi=
s case it will be true for any class which is copy constructible, which is =
not the desired result.</font></span></div></div></blockquote></div><br><di=
v>If you want to check whether moving is more efficient than copying, <font=
face=3D"Courier">is_nothrow_move_constructible</font> might help. This dep=
ends on <font face=3D"Courier">noexcept</font> correctness of user-defined =
move constructors.</div></div></blockquote><div><br>That would lead to dysf=
unctional code. Imagine a class like `std::list`, but is move-only. Such a =
class would not be nothrow move constructible, and it wouldn't be copy =
constructible. So... what do you pick?<br><br>At the end of the day, there&=
#39;s no way to guaranteeably know if moving is more efficient than copying=
.. However, moving will in virtually every case be no less efficient than co=
pying (even with `std::list`).<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/0bbcd911-51cd-4728-8974-0a9ae28cda94%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/0bbcd911-51cd-4728-8974-0a9ae28cda94=
%40isocpp.org</a>.<br />
------=_Part_731_339214849.1474868871923--
------=_Part_730_701072830.1474868871923--
.
Author: David Krauss <potswa@gmail.com>
Date: Mon, 26 Sep 2016 15:52:13 +0800
Raw View
--Apple-Mail=_9FA66F61-9FF8-4310-9661-7816A22AE303
Content-Transfer-Encoding: quoted-printable
Content-Type: text/plain; charset=UTF-8
> On 2016=E2=80=9309=E2=80=9326, at 1:47 PM, Nicol Bolas <jmckesson@gmail.c=
om> wrote:
>=20
> That would lead to dysfunctional code. Imagine a class like `std::list`, =
but is move-only. Such a class would not be nothrow move constructible, and=
it wouldn't be copy constructible. So... what do you pick?
=E2=80=9CMight help=E2=80=9D is weaker than =E2=80=9Cwill immediately solve=
this problem.=E2=80=9D
By itself, to me, choose_best_input_modifier has some code smell. What=E2=
=80=99s its ultimate goal? Possibly to combat template bloat by shifting de=
generate move constructor calls to copy constructors. In that case, =E2=80=
=9Cthrowing move construction =E2=89=88 copy construction=E2=80=9D could be=
a reasonable approximation, but likely not a slam dunk. (Even going that r=
oute, SFINAE might be a better way of coding it.)
> At the end of the day, there's no way to guaranteeably know if moving is =
more efficient than copying. However, moving will in virtually every case b=
e no less efficient than copying (even with `std::list`).
Right. Usual best practice is to move when it=E2=80=99s safe, forward when =
unsure, and let dispatching and inlining take care of the rest.
--=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/2781745E-973C-406B-A67D-A2EF3C644884%40gmail.com=
..
--Apple-Mail=_9FA66F61-9FF8-4310-9661-7816A22AE303
Content-Transfer-Encoding: quoted-printable
Content-Type: text/html; charset=UTF-8
<html><head><meta http-equiv=3D"Content-Type" content=3D"text/html charset=
=3Dutf-8"></head><body style=3D"word-wrap: break-word; -webkit-nbsp-mode: s=
pace; -webkit-line-break: after-white-space;" class=3D""><br class=3D""><di=
v><blockquote type=3D"cite" class=3D""><div class=3D"">On 2016=E2=80=9309=
=E2=80=9326, at 1:47 PM, Nicol Bolas <<a href=3D"mailto:jmckesson@gmail.=
com" class=3D"">jmckesson@gmail.com</a>> wrote:</div><br class=3D"Apple-=
interchange-newline"><div class=3D""><div dir=3D"ltr" class=3D"">That would=
lead to dysfunctional code. Imagine a class like `std::list`, but is move-=
only. Such a class would not be nothrow move constructible, and it wouldn't=
be copy constructible. So... what do you pick?</div></div></blockquote><di=
v><br class=3D""></div>=E2=80=9CMight help=E2=80=9D is weaker than =E2=80=
=9Cwill immediately solve this problem.=E2=80=9D</div><div><br class=3D""><=
/div><div>By itself, to me, <font face=3D"Courier" class=3D"">choose_best_i=
nput_modifier</font> has some code smell. What=E2=80=99s its ultimate goal?=
Possibly to combat template bloat by shifting degenerate move constructor =
calls to copy constructors. In that case, =E2=80=9Cthrowing move constructi=
on =E2=89=88 copy construction=E2=80=9D could be a reasonable approximation=
, but likely not a slam dunk. (Even going that route, SFINAE might be a bet=
ter way of coding it.)</div><div><br class=3D""></div><div><blockquote type=
=3D"cite" class=3D""><div class=3D""><div dir=3D"ltr" class=3D""><div class=
=3D"">At the end of the day, there's no way to guaranteeably know if moving=
is more efficient than copying. However, moving will in virtually every ca=
se be no less efficient than copying (even with `std::list`).<br class=3D""=
></div></div></div></blockquote><br class=3D""></div><div>Right. Usual best=
practice is to move when it=E2=80=99s safe, forward when unsure, and let d=
ispatching and inlining take care of the rest.</div><br class=3D""></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/2781745E-973C-406B-A67D-A2EF3C644884%=
40gmail.com?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/2781745E-973C-406B-A67D-A2EF3C644884%=
40gmail.com</a>.<br />
--Apple-Mail=_9FA66F61-9FF8-4310-9661-7816A22AE303--
.