On Wednesday, 9 April 2014 at 14:59:35 UTC, Benjamin Thaut wrote:
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
This would be very nice. Yes please.