On Monday, 24 February 2014 at 14:14:43 UTC, Tobias Pankrath wrote:
On Monday, 24 February 2014 at 13:56:01 UTC, Remo wrote:
Hi,

right now I am truing to figure out how the constructors behave in D2.

Question 1: why it is not possible to create custom ctor for struct?

The design of D relies on the fact that every type has a T.init property that is known to the compiler and used when in C++ the default ctor would get called. In constructors you can rely on (this == T.init), for example.

You need to pick one T.init or default constructors and D picked T.init.

The design of D relies on Andrei opinion. He is indeed convinced that default constructors are impossible.

However, you can write "default constructor" right now like:

struct S
{
   Type t;
   this(int)
   {
      t = whather_is_callable_in_CTFE();
   }
}

enum E : S
{
   A = S(0)
}

void main()
{
  E e;
  assert (e.t == whather_is_callable_in_CTFE());
}

Since compiler does this, it can also accept straight syntax and semantic:

struct S
{
   Type t;
   this() // proxibited default constructor now
   {
      t = whather_is_callable_in_CTFE();
   }
}

What D really lacks is ability to call function in runtime after struct instance creation like:

struct S
{
   @runtime this() {}
   ~this(){}
}

lowering to:
S s;
s.__runtime_ctor();

However, since compiler does this all over the place (postblits, copy constructors, destructors, etc.) There is no conceptual difference between having:

S s
s.__runtime_ctor();

and

S s;
s.__dtor();

In other words, there is no objective necessity not to have compile time and runtime default struct constructors since compiler already heavily does conceptually and technically similar things.

Reply via email to