<div dir="ltr">Nicolas, consider<div><br></div><div>    template &lt;typename T&gt;<br>    using vec = std::vector&lt;T&gt;;<br><br>    template &lt;typename T&gt;<br>    void foo(vec&lt;T&gt; v);<br></div><div><br></div><div>When you pass `std::vector&lt;int&gt;{}` to `foo`, `T` gets deduced to `int`. This works, because `vec&lt;T&gt;` is equivalent to `std::vector&lt;T&gt;` and we can deduce `T` in `std::vector&lt;T&gt;` from `std::vector&lt;int&gt;`.</div><div><br></div><div>With your proposal, however, `vec&lt;T&gt;` is no longer necessarily equivalent to `std::vector&lt;T&gt;`. It is also not obvious how template argument deduction should be modified to ensure that `T` still gets deduced to `int` in my example. What do you propose?</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Fri, Nov 19, 2021 at 4:59 PM Nicolas Weidmann via Std-Proposals &lt;<a href="mailto:std-proposals@lists.isocpp.org">std-proposals@lists.isocpp.org</a>&gt; wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">All I am saying is that alias templates are not as transparent to type deduction as written in your first response.<div><br></div><div>Then why allow the usage of dependent types in alias templates and allow something like std::type_identity_t?</div><div><br></div><div>Nicolas</div><div><br></div><div><br><br><div dir="ltr">Sent from my iPhone</div><div dir="ltr"><br><blockquote type="cite">On 19 Nov 2021, at 16:43, Arthur O&#39;Dwyer &lt;<a href="mailto:arthur.j.odwyer@gmail.com" target="_blank">arthur.j.odwyer@gmail.com</a>&gt; wrote:<br><br></blockquote></div><blockquote type="cite"><div dir="ltr">﻿<div dir="ltr"><div dir="ltr">On Fri, Nov 19, 2021 at 10:31 AM Nicolas Weidmann &lt;<a href="mailto:n.weidmann@bluewin.ch" target="_blank">n.weidmann@bluewin.ch</a>&gt; wrote:<br></div><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">Based on your last example, we would get:<div><br></div><div><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">#include</span><span style="font-size:10.5pt;font-family:Consolas"> </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(163,21,21)">vector</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">&gt;</span><span style="font-size:10.5pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">#include</span><span style="font-size:10.5pt;font-family:Consolas"> </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(163,21,21)">set</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">&gt;</span><span style="font-size:10.5pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">#include</span><span style="font-size:10.5pt;font-family:Consolas"> </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(163,21,21)">string</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">&gt;</span><span style="font-size:10.5pt;font-family:Consolas"><u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">template</span><span style="font-size:10.5pt;font-family:Consolas">&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">typename</span><span style="font-size:10.5pt;font-family:Consolas">&gt; </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">struct</span><span style="font-size:10.5pt;font-family:Consolas"> no_default_alias3;<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">template</span><span style="font-size:10.5pt;font-family:Consolas">&lt;&gt; </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">struct</span><span style="font-size:10.5pt;font-family:Consolas"> no_default_alias3&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:10.5pt;font-family:Consolas">&gt; {<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">   </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">using</span><span style="font-size:10.5pt;font-family:Consolas"> type = std::vector&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:10.5pt;font-family:Consolas">&gt;;<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">};<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">template</span><span style="font-size:10.5pt;font-family:Consolas">&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">typename</span><span style="font-size:10.5pt;font-family:Consolas"> T&gt; </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">using</span><span style="font-size:10.5pt;font-family:Consolas"> alias3 = </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">typename</span><span style="font-size:10.5pt;font-family:Consolas"> no_default_alias3&lt;T&gt;::type;<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">template</span><span style="font-size:10.5pt;font-family:Consolas">&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">typename</span><span style="font-size:10.5pt;font-family:Consolas"> T&gt; </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:10.5pt;font-family:Consolas"> bar(T a, alias3&lt;T&gt;) { }<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">template</span><span style="font-size:10.5pt;font-family:Consolas">&lt;&gt; </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">struct</span><span style="font-size:10.5pt;font-family:Consolas"> no_default_alias3&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">float</span><span style="font-size:10.5pt;font-family:Consolas">&gt; {<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">   </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">using</span><span style="font-size:10.5pt;font-family:Consolas"> type = std::vector&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:10.5pt;font-family:Consolas">&gt;;<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">};<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">template</span><span style="font-size:10.5pt;font-family:Consolas">&lt;&gt; </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">struct</span><span style="font-size:10.5pt;font-family:Consolas"> no_default_alias3&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">bool</span><span style="font-size:10.5pt;font-family:Consolas">&gt; {<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">   </span><span style="font-size:10.5pt;font-family:Consolas;color:blue">using</span><span style="font-size:10.5pt;font-family:Consolas"> type = std::set&lt;std::string&gt;;<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">};<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas"> </span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas;color:blue">void</span><span style="font-size:10.5pt;font-family:Consolas"> foo()<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">{<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">   bar(</span><span style="font-size:10.5pt;font-family:Consolas;color:rgb(9,134,88)">1.0f</span><span style="font-size:10.5pt;font-family:Consolas">, std::vector&lt;</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">int</span><span style="font-size:10.5pt;font-family:Consolas">&gt;{});<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">   bar(</span><span style="font-size:10.5pt;font-family:Consolas;color:blue">true</span><span style="font-size:10.5pt;font-family:Consolas">, std::set&lt;std::string&gt;{});<u></u><u></u></span></p><p class="MsoNormal" style="margin:0cm 0cm 0.0001pt;font-size:11pt;font-family:Calibri,sans-serif;line-height:14.25pt;background-color:rgb(255,255,254)"><span style="font-size:10.5pt;font-family:Consolas">}</span></p></div></div></blockquote><div><br></div><div>IIUC, you&#39;ve just renamed `std::identity` to `no_default_alias3` and left everything else the same; is that right?</div><div>So your `no_default_alias3` template is serving as a &quot;type deduction firewall,&quot; in the same way as `std::identity` does today.</div><div>And in particular, it is <i><b>not</b></i> acting in the same way as an alias template does today (because aliases do not serve as firewalls).</div><div><br></div><div>I think we&#39;re now going around in circles, but just in case, let me show you a program that directly compares the (transparent) behavior of aliases with the (firewalling) behavior of non-aliases.</div><div><br></div><div>template&lt;class T&gt; using Alias = T;</div><div>template&lt;class T&gt; struct Nonalias { using type = T; };</div><div><br></div><div>template&lt;class T&gt; void take_alias(Alias&lt;T&gt;);  // OK, equivalent to void take_alias(T); T is deducible</div><div>template&lt;class T&gt; void take_nonalias(typename Nonalias&lt;T&gt;::type);  // OK, but T is not deducible</div><div><br></div><div>int main() {</div><div>    take_alias(42);  // OK, T=int</div><div>    take_nonalias(42);  // does not compile, T can&#39;t be deduced</div><div>}</div><div><br></div><div>My impression of your original message/proposal is that you don&#39;t understand this fundamental difference between aliases and nonaliases, and you&#39;re basically proposing that either (1) some-or-all kinds of aliases should behave more like nonaliases, or (2) it should be possible to define (certain kinds of) nonaliases using a slight variation of alias syntax (instead of using the existing nonalias syntax).</div><div><br></div><div>HTH,</div><div>Arthur</div></div></div>
</div></blockquote></div></div>-- <br>
Std-Proposals mailing list<br>
<a href="mailto:Std-Proposals@lists.isocpp.org" target="_blank">Std-Proposals@lists.isocpp.org</a><br>
<a href="https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals" rel="noreferrer" target="_blank">https://lists.isocpp.org/mailman/listinfo.cgi/std-proposals</a><br>
</blockquote></div>

