On 2/27/18 3:59 PM, Radu wrote:
On Tuesday, 27 February 2018 at 20:51:25 UTC, ag0aep6g wrote:
On 02/27/2018 09:30 PM, Radu wrote:

enum Type { a };
struct S(Type t = Type.a)
{
     this(Type)(Type t)
     {
         import std.stdio;
         writeln("ctor called.");
     }
}
void main()
{
    auto x = S!(Type.a)(Type.a);
    void* y = &x;
    auto z = (cast(S!(Type.a)) y);
}

[snip]

So the bug is that somehow the templated version makes it so there is an implicit void* ctor.

Look at your constructor. You actually have a TEMPLATED constructor inside a TEMPLATED type.

In other words, inside your constructor, `Type` is not an enum Type, it's actually a void *.

It becomes clearer if you change the name of the second template parameter:

struct S(Type t = Type.a)
{
   this(T)(T t)
   {
       import std.stdio;
       writeln("ctor called.");
   }
}

-Steve

Reply via email to