220 39072 <18726326-2018-49e5-afb9-bfd0ae0937de@isocpp.org> article
Path: news.gmane.org!.POSTED!not-for-mail
From: mihailnajdenov@gmail.com
Newsgroups: gmane.comp.lang.c++.isocpp.proposals
Subject: Re: expression based deduction guides
Date: Wed, 11 Jul 2018 00:47:07 -0700 (PDT)
Lines: 452
Approved: news@gmane.org
Message-ID: <18726326-2018-49e5-afb9-bfd0ae0937de@isocpp.org>
References: <c0bed6aa-9fd9-42fe-9ad6-ab17b0c1d590@isocpp.org>
Reply-To: std-proposals@isocpp.org
NNTP-Posting-Host: blaine.gmane.org
Mime-Version: 1.0
Content-Type: multipart/mixed; 
	boundary="----=_Part_126122_1436810886.1531295227688"
X-Trace: blaine.gmane.org 1531295103 15363 195.159.176.226 (11 Jul 2018 07:45:03 GMT)
X-Complaints-To: usenet@blaine.gmane.org
NNTP-Posting-Date: Wed, 11 Jul 2018 07:45:03 +0000 (UTC)
To: ISO C++ Standard - Future Proposals <std-proposals@isocpp.org>
Original-X-From: std-proposals+bncBCUJ3A7GRAPRB7HLS3NAKGQEZ4GBAIQ@isocpp.org Wed Jul 11 09:44:59 2018
Return-path: <std-proposals+bncBCUJ3A7GRAPRB7HLS3NAKGQEZ4GBAIQ@isocpp.org>
Envelope-to: gclcip-std-proposals@m.gmane.org
Original-Received: from mail-yw0-f199.google.com ([209.85.161.199])
	by blaine.gmane.org with esmtp (Exim 4.84_2)
	(envelope-from <std-proposals+bncBCUJ3A7GRAPRB7HLS3NAKGQEZ4GBAIQ@isocpp.org>)
	id 1fd9o3-0003sA-8N
	for gclcip-std-proposals@m.gmane.org; Wed, 11 Jul 2018 09:44:59 +0200
Original-Received: by mail-yw0-f199.google.com with SMTP id p11-v6sf24797739ywm.4
        for <gclcip-std-proposals@m.gmane.org>; Wed, 11 Jul 2018 00:47:10 -0700 (PDT)
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=isocpp-org.20150623.gappssmtp.com; s=20150623;
        h=date:from:to:message-id:in-reply-to:references:subject:mime-version
         :x-original-sender:reply-to:precedence:mailing-list:list-id
         :list-post:list-help:list-archive:list-subscribe:list-unsubscribe;
        bh=8bxhsOdzpgdLotkCeyVtxY3mQ1+0FLvz5ZjJB8yr+7w=;
        b=SCiM3F3KbfjOj75BF/iCdV77OA+jUsmJohybMrHxb9vNvOdolHQeku1HF+4DWC6sjN
         I6u9YLBC+7gYuYN6poaxPGKiBhT69Q76kB6h+GEMDmCLUqD0LJWytAHk2A5cD6n//DgR
         O1YTmkqoPO8sBbdJq/AkhBbnvGoCS8tuy4aay4/Pf8m35wcbs95rEU3xYTKG3HM7/gAA
         5LtMNFVPyurVIFqLtbcQ5taWl47i4svrSCGZrdz7n1/e7SEGk32gS+jiu6jnrLQODIqS
         BMZbO/hT8VNuNBEAsEAXh5WZtU4pB4f0fWCencWelas9oPpjexKVOUWZtPKCyDBl68NA
         MoOQ==
DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=gmail.com; s=20161025;
        h=date:from:to:message-id:in-reply-to:references:subject:mime-version
         :x-original-sender:reply-to:precedence:mailing-list:list-id
         :list-post:list-help:list-archive:list-subscribe:list-unsubscribe;
        bh=8bxhsOdzpgdLotkCeyVtxY3mQ1+0FLvz5ZjJB8yr+7w=;
        b=UJnJnMYlsFvhjIDYYdUfF+aMvnmZTIl+Rxw4MPvr/O2bqykVoqxNH6CoE8/p/iW3SM
         GW6CcZDmSbFD/BFK8ikEfoYuu8gILUIYdpsfBB4LiXKuAg9p7zRf2/pKu+qKW0OwkWQy
         9LISBCEZY4F0QzpqXzeL4Av+QVIMSrKXe28gXUWfLB8EipO5NkvqYHGNzmiUsYiqrsxy
         Rv6rRtp2eu9EZmQKk0WLCfV53fn9cDfGS5nYb8NXwYDF1XoW/isY5FfkT0cZgA2VX3mT
         j2EgKbkpt+VE3q+lhJUUyA0c9ebzrPlWdRfZMlxkl8kfUIq+rqoeilbmzD7VI3zNIAAs
         vJBA==
X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed;
        d=1e100.net; s=20161025;
        h=x-gm-message-state:date:from:to:message-id:in-reply-to:references
         :subject:mime-version:x-original-sender:reply-to:precedence
         :mailing-list:list-id:x-spam-checked-in-group:list-post:list-help
         :list-archive:list-subscribe:list-unsubscribe;
        bh=8bxhsOdzpgdLotkCeyVtxY3mQ1+0FLvz5ZjJB8yr+7w=;
        b=VyxmaUASIAZTs4MXrPDgNBfSYYGg4v8V0vmoUYq9F5ddS7Pf1rcDJh5W3SYJVp+9V8
         qs659Zfdq7Mhyu2v9Be7e6U32k343tdIBd5wNcaTvS5WVqnxh6MO/w9DHeroXERS/kBh
         So/6MherDEWlj5Ev+S2Npty00SknRA4K+vkXLZebmE5+yurmZ2yoD3dp1PhOiT/CyiVj
         DmUu8l5W2XeIN3DSIuIBx9hJ5P9BIKkC/BTAjYcybRi0AHhCu5oIN12sGc+7kotooc0v
         oWHZa4USeEgKfIUt7ePL84PUqfBeGZGq+h4RlPHsOFL4IPsDmEt6uvTWn/8xuV6qfXmJ
         mTZg==
X-Gm-Message-State: APt69E266noByz7+Ez6gYdQJAcz2uapFosPtR6tt7ETI3VL9ZSHKb8+9
	jWMl7VlGWf73Ldmw0bOI5Ck0QA==
X-Google-Smtp-Source: AAOMgpf1xHAJ8CQb7/QQYnzbcAKYOMsRI0+pDtmHSH8DkUzUOjADpJ6wyj73rJVkgBZHnm9Ebgnubg==
X-Received: by 2002:a0d:d790:: with SMTP id z138-v6mr8222930ywd.194.1531295229622;
        Wed, 11 Jul 2018 00:47:09 -0700 (PDT)
X-BeenThere: std-proposals@isocpp.org
Original-Received: by 2002:a81:7a4e:: with SMTP id v75-v6ls3015563ywc.12.gmail; Wed, 11
 Jul 2018 00:47:08 -0700 (PDT)
X-Received: by 2002:a81:7dd6:: with SMTP id y205-v6mr3733871ywc.1.1531295228386;
        Wed, 11 Jul 2018 00:47:08 -0700 (PDT)
In-Reply-To: <c0bed6aa-9fd9-42fe-9ad6-ab17b0c1d590@isocpp.org>
X-Original-Sender: MihailNajdenov@gmail.com
Precedence: list
Mailing-list: list std-proposals@isocpp.org; contact std-proposals+owners@isocpp.org
List-ID: <std-proposals.isocpp.org>
X-Spam-Checked-In-Group: std-proposals@isocpp.org
X-Google-Group-Id: 399137483710
List-Post: <https://groups.google.com/a/isocpp.org/group/std-proposals/post>, <mailto:std-proposals@isocpp.org>
List-Help: <https://support.google.com/a/isocpp.org/bin/topic.py?topic=25838>, <mailto:std-proposals+help@isocpp.org>
List-Archive: <https://groups.google.com/a/isocpp.org/group/std-proposals/>
List-Subscribe: <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>,
 <mailto:std-proposals+subscribe@isocpp.org>
List-Unsubscribe: <mailto:googlegroups-manage+399137483710+unsubscribe@googlegroups.com>,
 <https://groups.google.com/a/isocpp.org/group/std-proposals/subscribe>
Xref: news.gmane.org gmane.comp.lang.c++.isocpp.proposals:39072
Archived-At: <http://permalink.gmane.org/gmane.comp.lang.c++.isocpp.proposals/39072>

------=_Part_126122_1436810886.1531295227688
Content-Type: multipart/alternative; 
	boundary="----=_Part_126123_1884275506.1531295227690"

------=_Part_126123_1884275506.1531295227690
Content-Type: text/plain; charset="UTF-8"



On Wednesday, July 11, 2018 at 3:00:32 AM UTC+3, bastie...@gmail.com wrote:
>
> Hi,
>
> Deduction guides are great but could be even better if we were able to 
> better control the conversion and why not even produce custom conversions.
> For instance if you wanted this work:
>
> std::list<int> y { ... };
> std::vector<int> x { y };
>
> you could just write the following to make it work:
>
> template<Container T>
> std::vector(Container&& t) { return std::vector{t.begin(),  t.end()}; } //or 
> "= expr".The block would be as restrictive as c++11's constexpr functions
>  
>
And if those expression where preparsed and injected instead of working 
> like normal function returns:
>
 

>
> //Implementing lazy on the library side
> template<class T>
> struct Lazy : public T
> {
>     Lazy(T&& f) : T(std::forward<T>(f)) {}    
>     using T::operator();
> };
>
> template<class T>
> Lazy(T&& x) { return Lazy{[&]{ return x; }}; } //no recursion, uses given 
> constructor as deduction guide
>
>  

> template<class T>
> void func(Lazy<T> x)
> {
>      x();
>      x();
> }
>
> int f()
> {
>    std::cout << "hello" << std::endl;
>    return 0;
> }
>
> int main()
> {
>    func(f()); //func(Lazy{[&]{return f(); }});
> }
>
> //Implementing overload set as arguments by allowing unresolved types to 
> be passed to OverloadSet before error
> template<class T>
> struct OverloadSet : public T
> {
>  Lazy(T&& f) : T(std::forward<T>(f)) {} 
>  using T::operator();
> };
>
> template<class T>
> OverloadSet(T&& x)
> {
>  return OverloadSet{
>   []<class... Args>(Args&&... args)
>      noexcept(noexcept(x(std::forward<Args...>(args)))
>      -> decltype(x(std::forward<Args...>(args))
>    {
>      return x(std::forward<Args...>(args));
>    }
>  };
> }
>
> int f() { return 0; }
> int f(int) { return 0; }
>
> template<class T>
> void func(T&& x)
> {
>  x(0);
>  x();
> }
>
> int main()
> {
>  func(f); /* func(OverloadSet{[]<class... Args>(Args&&... args)
>                 noexcept(noexcept(x(std::forward<Args...>(args)))
>                 -> decltype(x(std::forward<Args...>(args))
>              {
>                 return x(std::forward<Args...>(args));
>              }); */
> }
>
> This would allow to have a real C++ alternative to long expression, type 
> conversions macros.
> Just a thought, what do you think?
> Anyway thanks for the read.
>


So basically, these are external constructors. My gut feeling tells me, 
these were considered and rejected (postponed?).

Needless to say all is possible if you make these plain old functions - 
auto lazy(. . . ), auto OverloadSet(. . .)
Granted in the overload set case you will lose the implicit conversion. 


And BTW there is no reason for these to be constexpr - they simply need to 
return the correct type .

However, I see no reason recursion NOT to be a problem. But that is solvable

template<class T>
Lazy(T&& x) 
{ 
  auto t = [&]{ return x; };
  return Lazy<decltype(t)>{std::move(t)}; *//< ### deduction guides IGNORED 
if explicit type is specified *
}

 As I said, I am pretty sure this was considered - there is no way not to 
have been, considering deduction guides look exactly like 
constructor-returning-a-type. 
I just does not have a body... yet?

-- 
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/18726326-2018-49e5-afb9-bfd0ae0937de%40isocpp.org.

------=_Part_126123_1884275506.1531295227690
Content-Type: text/html; charset="UTF-8"
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr"><br><br>On Wednesday, July 11, 2018 at 3:00:32 AM UTC+3, b=
astie...@gmail.com wrote:<blockquote class=3D"gmail_quote" style=3D"margin:=
 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><div =
dir=3D"ltr"><div>Hi,</div><div><br></div><div>Deduction guides are great bu=
t could be even better if we were able to better control the conversion and=
 why not even produce custom conversions.</div><div>For instance if you wan=
ted this work:</div><div><br></div><div style=3D"background-color:rgb(250,2=
50,250);border-color:rgb(187,187,187);border-style:solid;border-width:1px;w=
ord-wrap:break-word"><code><div><span style=3D"color:#000">std</span><span =
style=3D"color:#660">::</span><span style=3D"color:#000">list</span><span s=
tyle=3D"color:#080">&lt;int&gt;</span><span style=3D"color:#000"> y </span>=
<span style=3D"color:#660">{</span><span style=3D"color:#000"> </span><span=
 style=3D"color:#660">...</span><span style=3D"color:#000"> </span><span st=
yle=3D"color:#660">};</span><span style=3D"color:#000"><br>std</span><span =
style=3D"color:#660">::</span><span style=3D"color:#000">vector</span><span=
 style=3D"color:#080">&lt;int&gt;</span><span style=3D"color:#000"> x </spa=
n><span style=3D"color:#660">{</span><span style=3D"color:#000"> y </span><=
span style=3D"color:#660">};</span></div></code></div><div><br></div><div>y=
ou could just write the following to make it work:</div><div><br></div><div=
 style=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);b=
order-style:solid;border-width:1px;word-wrap:break-word"><code><div><span s=
tyle=3D"color:#008">template</span><span style=3D"color:#660">&lt;</span><s=
pan style=3D"color:#606">Container</span><span style=3D"color:#000"> T</spa=
n><span style=3D"color:#660">&gt;</span><span style=3D"color:#000"><br>std<=
/span><span style=3D"color:#660">::</span><span style=3D"color:#000">vector=
</span><span style=3D"color:#660">(</span><span style=3D"color:#606">Contai=
ner</span><span style=3D"color:#660">&amp;&amp;</span><span style=3D"color:=
#000"> t</span><span style=3D"color:#660">)</span><span style=3D"color:#000=
"> </span><span style=3D"color:#660">{</span><span style=3D"color:#000"> </=
span><span style=3D"color:#008">return</span><span style=3D"color:#000"> st=
d</span><span style=3D"color:#660">::</span><span style=3D"color:#000">vect=
or</span><span style=3D"color:#660">{</span><span style=3D"color:#000">t</s=
pan><span style=3D"color:#660">.</span><span style=3D"color:#008">begin</sp=
an><span style=3D"color:#660">(),</span><span style=3D"color:#000"> =C2=A0t=
</span><span style=3D"color:#660">.</span><span style=3D"color:#008">end</s=
pan><span style=3D"color:#660">()};</span><span style=3D"color:#000"> </spa=
n><span style=3D"color:#660">}</span><span style=3D"color:#000"> </span><sp=
an style=3D"color:#800">//or &quot;=3D expr&quot;.The block would be as res=
trictive as c++11&#39;s constexpr functions</span></div></code></div><div>=
=C2=A0</div></div></blockquote><blockquote class=3D"gmail_quote" style=3D"m=
argin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"=
><div dir=3D"ltr"><div></div><div>And if those expression where preparsed a=
nd injected instead of working like normal function returns:</div></div></b=
lockquote><div>=C2=A0</div><blockquote class=3D"gmail_quote" style=3D"margi=
n: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding-left: 1ex;"><di=
v dir=3D"ltr"><div><br></div><div style=3D"background-color:rgb(250,250,250=
);border-color:rgb(187,187,187);border-style:solid;border-width:1px;word-wr=
ap:break-word"><code><div><span style=3D"color:#800">//Implementing lazy on=
 the library side</span><span style=3D"color:#000"><br></span><span style=
=3D"color:#008">template</span><span style=3D"color:#660">&lt;</span><span =
style=3D"color:#008">class</span><span style=3D"color:#000"> T</span><span =
style=3D"color:#660">&gt;</span><span style=3D"color:#000"><br></span><span=
 style=3D"color:#008">struct</span><span style=3D"color:#000"> </span><span=
 style=3D"color:#606">Lazy</span><span style=3D"color:#000"> </span><span s=
tyle=3D"color:#660">:</span><span style=3D"color:#000"> </span><span style=
=3D"color:#008">public</span><span style=3D"color:#000"> T<br></span><span =
style=3D"color:#660">{</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 <=
/span><span style=3D"color:#606">Lazy</span><span style=3D"color:#660">(</s=
pan><span style=3D"color:#000">T</span><span style=3D"color:#660">&amp;&amp=
;</span><span style=3D"color:#000"> f</span><span style=3D"color:#660">)</s=
pan><span style=3D"color:#000"> </span><span style=3D"color:#660">:</span><=
span style=3D"color:#000"> T</span><span style=3D"color:#660">(</span><span=
 style=3D"color:#000">std</span><span style=3D"color:#660">::</span><span s=
tyle=3D"color:#000">forward</span><span style=3D"color:#660">&lt;</span><sp=
an style=3D"color:#000">T</span><span style=3D"color:#660">&gt;(</span><spa=
n style=3D"color:#000">f</span><span style=3D"color:#660">))</span><span st=
yle=3D"color:#000"> </span><span style=3D"color:#660">{}</span><span style=
=3D"color:#000"> =C2=A0 =C2=A0<br>=C2=A0 =C2=A0 </span><span style=3D"color=
:#008">using</span><span style=3D"color:#000"> T</span><span style=3D"color=
:#660">::</span><span style=3D"color:#008">operator</span><span style=3D"co=
lor:#660">();</span><span style=3D"color:#000"><br></span><span style=3D"co=
lor:#660">};</span><span style=3D"color:#000"><br><br></span><span style=3D=
"color:#008">template</span><span style=3D"color:#660">&lt;</span><span sty=
le=3D"color:#008">class</span><span style=3D"color:#000"> T</span><span sty=
le=3D"color:#660">&gt;</span><span style=3D"color:#000"><br></span><span st=
yle=3D"color:#606">Lazy</span><span style=3D"color:#660">(</span><span styl=
e=3D"color:#000">T</span><span style=3D"color:#660">&amp;&amp;</span><span =
style=3D"color:#000"> x</span><span style=3D"color:#660">)</span><span styl=
e=3D"color:#000"> </span><font color=3D"#666600"><span style=3D"color:#660"=
>{</span><span style=3D"color:#000"> </span><span style=3D"color:#008">retu=
rn</span></font><span style=3D"color:#000"> </span><span style=3D"color:#60=
6">Lazy</span><span style=3D"color:#660">{[&amp;]{</span><span style=3D"col=
or:#000"> </span><span style=3D"color:#008">return</span><span style=3D"col=
or:#000"> x</span><span style=3D"color:#660">;</span><span style=3D"color:#=
000"> </span><span style=3D"color:#660">}};</span><span style=3D"color:#000=
"> </span><span style=3D"color:#660">}</span><span style=3D"color:#000"> </=
span><span style=3D"color:#800">//no recursion, uses given constructor as d=
eduction guide</span><span style=3D"color:#000"><br><br></span></div></code=
></div></div></blockquote><div>=C2=A0</div><blockquote class=3D"gmail_quote=
" style=3D"margin: 0;margin-left: 0.8ex;border-left: 1px #ccc solid;padding=
-left: 1ex;"><div dir=3D"ltr"><div style=3D"background-color:rgb(250,250,25=
0);border-color:rgb(187,187,187);border-style:solid;border-width:1px;word-w=
rap:break-word"><code><div><span style=3D"color:#000"></span><span style=3D=
"color:#008">template</span><span style=3D"color:#660">&lt;</span><span sty=
le=3D"color:#008">class</span><span style=3D"color:#000"> T</span><span sty=
le=3D"color:#660">&gt;</span><span style=3D"color:#000"><br></span><span st=
yle=3D"color:#008">void</span><span style=3D"color:#000"> func</span><span =
style=3D"color:#660">(</span><span style=3D"color:#606">Lazy</span><span st=
yle=3D"color:#660">&lt;</span><span style=3D"color:#000">T</span><span styl=
e=3D"color:#660">&gt;</span><span style=3D"color:#000"> x</span><span style=
=3D"color:#660">)</span><span style=3D"color:#000"><br></span><span style=
=3D"color:#660">{</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0=
x</span><span style=3D"color:#660">();</span><span style=3D"color:#000"><br=
>=C2=A0 =C2=A0 =C2=A0x</span><span style=3D"color:#660">();</span><span sty=
le=3D"color:#000"><br></span><span style=3D"color:#660">}</span><span style=
=3D"color:#000"><br><br></span><span style=3D"color:#008">int</span><span s=
tyle=3D"color:#000"> f</span><span style=3D"color:#660">()</span><span styl=
e=3D"color:#000"><br></span><span style=3D"color:#660">{</span><span style=
=3D"color:#000"><br>=C2=A0 =C2=A0std</span><span style=3D"color:#660">::</s=
pan><span style=3D"color:#000">cout </span><span style=3D"color:#660">&lt;&=
lt;</span><span style=3D"color:#000"> </span><span style=3D"color:#080">&qu=
ot;hello&quot;</span><span style=3D"color:#000"> </span><span style=3D"colo=
r:#660">&lt;&lt;</span><span style=3D"color:#000"> std</span><span style=3D=
"color:#660">::</span><span style=3D"color:#000">endl</span><span style=3D"=
color:#660">;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0</span><spa=
n style=3D"color:#008">return</span><span style=3D"color:#000"> </span><spa=
n style=3D"color:#066">0</span><span style=3D"color:#660">;</span><span sty=
le=3D"color:#000"><br></span><span style=3D"color:#660">}</span><span style=
=3D"color:#000"><br><br></span><span style=3D"color:#008">int</span><span s=
tyle=3D"color:#000"> main</span><span style=3D"color:#660">()</span><span s=
tyle=3D"color:#000"><br></span><span style=3D"color:#660">{</span><span sty=
le=3D"color:#000"><br>=C2=A0 =C2=A0func</span><span style=3D"color:#660">(<=
/span><span style=3D"color:#000">f</span><span style=3D"color:#660">());</s=
pan><span style=3D"color:#000"> </span><span style=3D"color:#800">//func(La=
zy{[&amp;]{return f(); }});</span><span style=3D"color:#000"><br></span><sp=
an style=3D"color:#660">}</span></div></code></div><div><br></div><div styl=
e=3D"background-color:rgb(250,250,250);border-color:rgb(187,187,187);border=
-style:solid;border-width:1px;word-wrap:break-word"><code><div><span style=
=3D"color:#800">//Implementing overload set as arguments by allowing unreso=
lved types to be passed to OverloadSet before error</span><span style=3D"co=
lor:#000"><br></span><span style=3D"color:#008">template</span><span style=
=3D"color:#660">&lt;</span><span style=3D"color:#008">class</span><span sty=
le=3D"color:#000"> T</span><span style=3D"color:#660">&gt;</span><span styl=
e=3D"color:#000"><br></span><span style=3D"color:#008">struct</span><span s=
tyle=3D"color:#000"> </span><span style=3D"color:#606">OverloadSet</span><s=
pan style=3D"color:#000"> </span><span style=3D"color:#660">:</span><span s=
tyle=3D"color:#000"> </span><span style=3D"color:#008">public</span><span s=
tyle=3D"color:#000"> T<br></span><span style=3D"color:#660">{</span><span s=
tyle=3D"color:#000"><br>=C2=A0</span><span style=3D"color:#606">Lazy</span>=
<span style=3D"color:#660">(</span><span style=3D"color:#000">T</span><span=
 style=3D"color:#660">&amp;&amp;</span><span style=3D"color:#000"> f</span>=
<span style=3D"color:#660">)</span><span style=3D"color:#000"> </span><span=
 style=3D"color:#660">:</span><span style=3D"color:#000"> T</span><span sty=
le=3D"color:#660">(</span><span style=3D"color:#000">std</span><span style=
=3D"color:#660">::</span><span style=3D"color:#000">forward</span><span sty=
le=3D"color:#660">&lt;</span><span style=3D"color:#000">T</span><span style=
=3D"color:#660">&gt;(</span><span style=3D"color:#000">f</span><span style=
=3D"color:#660">))</span><span style=3D"color:#000"> </span><span style=3D"=
color:#660">{}</span><span style=3D"color:#000"> <br>=C2=A0</span><span sty=
le=3D"color:#008">using</span><span style=3D"color:#000"> T</span><span sty=
le=3D"color:#660">::</span><span style=3D"color:#008">operator</span><span =
style=3D"color:#660">();</span><span style=3D"color:#000"><br></span><span =
style=3D"color:#660">};</span><span style=3D"color:#000"><br><br></span><sp=
an style=3D"color:#008">template</span><span style=3D"color:#660">&lt;</spa=
n><span style=3D"color:#008">class</span><span style=3D"color:#000"> T</spa=
n><span style=3D"color:#660">&gt;</span><span style=3D"color:#000"><br></sp=
an><span style=3D"color:#606">OverloadSet</span><span style=3D"color:#660">=
(</span><span style=3D"color:#000">T</span><span style=3D"color:#660">&amp;=
&amp;</span><span style=3D"color:#000"> x</span><span style=3D"color:#660">=
)</span><span style=3D"color:#000"><br></span><span style=3D"color:#660">{<=
/span><span style=3D"color:#000"><br>=C2=A0</span><span style=3D"color:#008=
">return</span><span style=3D"color:#000"> </span><span style=3D"color:#606=
">OverloadSet</span><span style=3D"color:#660">{</span><span style=3D"color=
:#000"><br>=C2=A0 </span><span style=3D"color:#660">[]&lt;</span><span styl=
e=3D"color:#008">class</span><span style=3D"color:#660">...</span><span sty=
le=3D"color:#000"> </span><span style=3D"color:#606">Args</span><span style=
=3D"color:#660">&gt;(</span><span style=3D"color:#606">Args</span><span sty=
le=3D"color:#660">&amp;&amp;...</span><span style=3D"color:#000"> args</spa=
n><span style=3D"color:#660">)</span><span style=3D"color:#000"><br>=C2=A0 =
=C2=A0 =C2=A0noexcept</span><span style=3D"color:#660">(</span><span style=
=3D"color:#000">noexcept</span><span style=3D"color:#660">(</span><span sty=
le=3D"color:#000">x</span><span style=3D"color:#660">(</span><span style=3D=
"color:#000">std</span><span style=3D"color:#660">::</span><span style=3D"c=
olor:#000">forw<wbr>ard</span><span style=3D"color:#660">&lt;</span><span s=
tyle=3D"color:#606">Args</span><span style=3D"color:#660">...&gt;(</span><s=
pan style=3D"color:#000">args</span><span style=3D"color:#660">)))</span><s=
pan style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0</span><span style=3D"colo=
r:#660">-&gt;</span><span style=3D"color:#000"> </span><span style=3D"color=
:#008">decltype</span><span style=3D"color:#660">(</span><span style=3D"col=
or:#000">x</span><span style=3D"color:#660">(</span><span style=3D"color:#0=
00">std</span><span style=3D"color:#660">::</span><span style=3D"color:#000=
">forward</span><span style=3D"color:#660">&lt;</span><span style=3D"color:=
#606">Args</span><span style=3D"color:#660">..<wbr>.&gt;(</span><span style=
=3D"color:#000">args</span><span style=3D"color:#660">))</span><span style=
=3D"color:#000"><br>=C2=A0 =C2=A0</span><span style=3D"color:#660">{</span>=
<span style=3D"color:#000"><br>=C2=A0 =C2=A0 =C2=A0</span><span style=3D"co=
lor:#008">return</span><span style=3D"color:#000"> x</span><span style=3D"c=
olor:#660">(</span><span style=3D"color:#000">std</span><span style=3D"colo=
r:#660">::</span><span style=3D"color:#000">forward</span><span style=3D"co=
lor:#660">&lt;</span><span style=3D"color:#606">Args</span><span style=3D"c=
olor:#660">...&gt;(</span><span style=3D"color:#000">args</span><span style=
=3D"color:#660">))<wbr>;</span><span style=3D"color:#000"><br>=C2=A0 =C2=A0=
</span><span style=3D"color:#660">}</span><span style=3D"color:#000"><br>=
=C2=A0</span><span style=3D"color:#660">};</span><span style=3D"color:#000"=
><br></span><span style=3D"color:#660">}</span><span style=3D"color:#000"><=
br><br></span><span style=3D"color:#008">int</span><span style=3D"color:#00=
0"> f</span><span style=3D"color:#660">()</span><span style=3D"color:#000">=
 </span><span style=3D"color:#660">{</span><span style=3D"color:#000"> </sp=
an><span style=3D"color:#008">return</span><span style=3D"color:#000"> </sp=
an><span style=3D"color:#066">0</span><span style=3D"color:#660">;</span><s=
pan style=3D"color:#000"> </span><span style=3D"color:#660">}</span><span s=
tyle=3D"color:#000"><br></span><span style=3D"color:#008">int</span><span s=
tyle=3D"color:#000"> f</span><span style=3D"color:#660">(</span><span style=
=3D"color:#008">int</span><span style=3D"color:#660">)</span><span style=3D=
"color:#000"> </span><span style=3D"color:#660">{</span><span style=3D"colo=
r:#000"> </span><span style=3D"color:#008">return</span><span style=3D"colo=
r:#000"> </span><span style=3D"color:#066">0</span><span style=3D"color:#66=
0">;</span><span style=3D"color:#000"> </span><span style=3D"color:#660">}<=
/span><span style=3D"color:#000"><br><br></span><span style=3D"color:#008">=
template</span><span style=3D"color:#660">&lt;</span><span style=3D"color:#=
008">class</span><span style=3D"color:#000"> T</span><span style=3D"color:#=
660">&gt;</span><span style=3D"color:#000"><br></span><span style=3D"color:=
#008">void</span><span style=3D"color:#000"> func</span><span style=3D"colo=
r:#660">(</span><span style=3D"color:#000">T</span><span style=3D"color:#66=
0">&amp;&amp;</span><span style=3D"color:#000"> x</span><span style=3D"colo=
r:#660">)</span><span style=3D"color:#000"><br></span><span style=3D"color:=
#660">{</span><span style=3D"color:#000"><br>=C2=A0x</span><span style=3D"c=
olor:#660">(</span><span style=3D"color:#066">0</span><span style=3D"color:=
#660">);</span><span style=3D"color:#000"><br>=C2=A0x</span><span style=3D"=
color:#660">();</span><span style=3D"color:#000"><br></span><span style=3D"=
color:#660">}</span><span style=3D"color:#000"><br><br></span><span style=
=3D"color:#008">int</span><span style=3D"color:#000"> main</span><span styl=
e=3D"color:#660">()</span><span style=3D"color:#000"><br></span><span style=
=3D"color:#660">{</span><span style=3D"color:#000"><br>=C2=A0func</span><sp=
an style=3D"color:#660">(</span><span style=3D"color:#000">f</span><span st=
yle=3D"color:#660">);</span><span style=3D"color:#000"> </span><span style=
=3D"color:#800">/* func(OverloadSet{[]&lt;class... Args&gt;(Args&amp;&amp;.=
... args)<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 noexcep=
t(noexcept(x(std::<wbr>forward&lt;Args...&gt;(args)))<br>=C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 -&gt; decltype(x(std::forward&lt;Arg=
s..<wbr>.&gt;(args))<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0{<b=
r>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 return x(std::for=
ward&lt;Args...&gt;(args))<wbr>;<br>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0}); */</span><span style=3D"color:#000"><br></span><span style=3D=
"color:#660">}</span></div></code></div><div><br></div><div>This would allo=
w to have a real C++ alternative to long expression, type conversions macro=
s.</div><div>Just a thought, what do you think?</div><div>Anyway thanks for=
 the read.</div></div></blockquote><div><br></div><div><br></div><div>So ba=
sically, these are external constructors. My gut feeling tells me, these we=
re considered and rejected (postponed?).<br></div><div><b></b><i></i><u></u=
><sub></sub><sup></sup><strike></strike><br></div><div>Needless to say all =
is possible if you make these plain old functions - auto lazy(. . . ), auto=
 OverloadSet(. . .)</div><div>Granted in the overload set case you will los=
e the implicit conversion.=C2=A0</div><div><br></div><div><br></div><div><s=
pan style=3D"display: inline !important; float: none; background-color: tra=
nsparent; color: rgb(34, 34, 34); font-family: &quot;Arial&quot;,&quot;Helv=
etica&quot;,sans-serif; font-size: 13px; font-style: normal; font-variant: =
normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: l=
eft; text-decoration: none; text-indent: 0px; text-transform: none; -webkit=
-text-stroke-width: 0px; white-space: normal; word-spacing: 0px;">And BTW t=
here is no reason for these to be constexpr - they simply need to return th=
e correct type .</span></div><div><br></div><div>However, I see no reason r=
ecursion NOT to be a problem. But that is solvable</div><font face=3D"couri=
er new,monospace"><br>template&lt;class T&gt;<br>Lazy(T&amp;&amp; x)=C2=A0<=
br><div>{=C2=A0</div><div>=C2=A0 auto t =3D=C2=A0<span style=3D"display: in=
line !important; float: none; background-color: transparent; color: rgb(34,=
 34, 34); font-family: courier new,monospace; font-size: 13px; font-style: =
normal; font-variant: normal; font-weight: 400; letter-spacing: normal; orp=
hans: 2; text-align: left; text-decoration: none; text-indent: 0px; text-tr=
ansform: none; -webkit-text-stroke-width: 0px; white-space: normal; word-sp=
acing: 0px;">[&amp;]{ return x; };</span></div>=C2=A0 return Lazy&lt;declty=
pe(t)&gt;{std::move(t)}; <i>//&lt; ### deduction guides IGNORED if explicit=
 type is specified=C2=A0</i><br>}</font><div><span style=3D"background-colo=
r: transparent; border-bottom-color: rgb(0, 0, 0); border-bottom-style: non=
e; border-bottom-width: 0px; border-image-outset: 0; border-image-repeat: s=
tretch; border-image-slice: 100%; border-image-source: none; border-image-w=
idth: 1; border-left-color: rgb(0, 0, 0); border-left-style: none; border-l=
eft-width: 0px; border-right-color: rgb(0, 0, 0); border-right-style: none;=
 border-right-width: 0px; border-top-color: rgb(0, 0, 0); border-top-style:=
 none; border-top-width: 0px; color: rgb(0, 0, 0); font-family: &amp;quot;A=
rial&amp;quot;,&amp;quot;Helvetica&amp;quot;,sans-serif; font-size: 13px; f=
ont-style: normal; font-variant: normal; font-weight: 400; letter-spacing: =
normal; margin-bottom: 0px; margin-left: 0px; margin-right: 0px; margin-top=
: 0px; orphans: 2; padding-bottom: 0px; padding-left: 0px; padding-right: 0=
px; padding-top: 0px; text-align: left; text-decoration: none; text-indent:=
 0px; text-transform: none; -webkit-text-stroke-width: 0px; white-space: no=
rmal; word-spacing: 0px;"></span><b></b><i></i><u></u><sub></sub><sup></sup=
><strike></strike><br></div><div>=C2=A0As I said, I am pretty sure this was=
 considered - there is no way not to have been, considering deduction guide=
s look exactly like constructor-returning-a-type.=C2=A0</div><div>I just do=
es not have a body... yet?</div></div>

<p></p>

-- <br />
You received this message because you are subscribed to the Google Groups &=
quot;ISO C++ Standard - Future Proposals&quot; group.<br />
To unsubscribe from this group and stop receiving emails from it, send an e=
mail to <a href=3D"mailto:std-proposals+unsubscribe@isocpp.org">std-proposa=
ls+unsubscribe@isocpp.org</a>.<br />
To post to this group, send email to <a href=3D"mailto:std-proposals@isocpp=
..org">std-proposals@isocpp.org</a>.<br />
To view this discussion on the web visit <a href=3D"https://groups.google.c=
om/a/isocpp.org/d/msgid/std-proposals/18726326-2018-49e5-afb9-bfd0ae0937de%=
40isocpp.org?utm_medium=3Demail&utm_source=3Dfooter">https://groups.google.=
com/a/isocpp.org/d/msgid/std-proposals/18726326-2018-49e5-afb9-bfd0ae0937de=
%40isocpp.org</a>.<br />

------=_Part_126123_1884275506.1531295227690--

------=_Part_126122_1436810886.1531295227688--

.
