<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 24 July 2014 19:37, John Colvin via Digitalmars-d <span dir="ltr"><<a href="mailto:digitalmars-d@puremagic.com" target="_blank">digitalmars-d@puremagic.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">On Thursday, 24 July 2014 at 04:53:41 UTC, Manu via Digitalmars-d wrote:<br>
</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div class="">
I'm running into consistent problems with default args and argument<br>
deduction in templates.<br>
There seem to be 2 consistent classes of problem:<br>
<br></div><div class="">
struct S(size_t len = 10)<br>
{<br>
  ubyte[len] data;<br>
}<br>
<br>
S!100 x; // this works fine<br>
S y; // this doesn't work (!)<br>
S!() z; // this works<br>
<br>
The template arg has a default arg, why require !() ??<br></div><div class="">
This causes problems in meta code, where you want to create an instance of<br>
some T, and T may be a normal type with no template args, in which case !()<br>
is invalid, but a template type with default args should also be<br>
acceptable, but it doesn't work because the meta code doesn't specify !().<br>
</div></blockquote>
<br>
This opens a whole can of worms. It's very useful to be able to distinguish between templates and their instantiations. Seeing as D's alias system works on a pass-by-name system, you can't have a system where simply referring to a template instantiates it with no arguments.<br>

<br>
Apart from anything else it would break *so* much code.<br>
</blockquote></div><br></div><div class="gmail_extra">Isn't the call to the constructor enough to distinguish it is an instantiation rather than a reference to the template itself?</div><div class="gmail_extra"><br></div>
<div class="gmail_extra">S is a template</div><div class="gmail_extra">S!() is a type</div><div class="gmail_extra">S(x,y,z) is a call to it's constructor, the expression has a type</div><div class="gmail_extra"><br></div>
<div class="gmail_extra">What is the useful distinction between S!()(x,y,z) and S(x,y,z)? How does either one of them make referring to the template 'S' difficult?</div><div class="gmail_extra">Is there some conflicting syntax where the parentheses mean something else when S perceived as a template? Why isn't the same problem applicable to function templates?</div>
</div>