Just to be clear, I don't want a default constructor for structs that gets called implictly by the compiler, like in C++.

Instead I would really love to have a explicit default constructor. E.g. it could look like this (alternative a new keyword "explicit" could be introduced, but introduction of new keywords is usually avoided if possible, AFAIK):

struct Foo
{
  this(void)
  {
    // do stuff here
  }
}

This default constructor would _never_ be called automatically by the compiler. (e.g. when a class is constructed that has struct members.) It would only be called in cases where the user explictly calls it.

The following lines would call the explicit default constructor

auto foo1 = Foo();
auto foo2 = new Foo();
foo1 = Foo(); // calls explicit constructor first, then calls assignment operator

Whereas the follwing would _not_ call the explicit default constructor.

class Bar
{
  Foo m_foo;
}
auto bar = new Bar();

Foo foo; // does not call the explict default constructor, because there is no explicit call here

I think this would fix all cases where you currently wish for a struct default constructor in D. Coupeled with "@disable this();" you could force users to always call one of the struct constructors. Currently I work around the issue of not having any default constructors by doing this:

struct DefaultCtor {}; //call default ctor type

enum defaultCtor = DefaultCtor();

struct Foo()
{
  @disable this();
  this(DefaultCtor)
  {
    // default constructor
  }

  this(int)
  {
    // other constructor
  }
}

auto foo = Foo(defaultCtor);

While this works, I'm getting anoyed by it every day. For example when refactoring types from Classes to Structs and vise versa. As well as when placing Classes on the stack using a helper struct. Or when having RAII structs that don't take any paramters in their constructor.

What do you think? C&C welcome.

Kind Regards
Benjamin Thaut




Reply via email to