On Thursday, 29 November 2012 at 17:12:29 UTC, jerro wrote:
The original idea is that there should be *no such thing* as default construction of a struct as being anything other than T.init. The default construction of a struct should be a compile time creature, not a runtime one.

Any methods or workarounds to try and make T() produce something different from T.init is bad D practice. The compiler tries to statically head them off, but probably should do a better job of that.

The only reason to associate no parameter constructors with default values is because of how C++ works. There is no reason why

Foo foo;                          (1)

should be equivalent to

auto foo = Foo();                 (2)

in D. We could allow constructors with no parameters and make (1) equivalent to

auto foo = Foo.init;              (3)

The current workaround when one wants (2) to construct the object at runtime is to define a static opCall, but that's messy and inconsistent. It's just one more quirk one needs to learn to effectively use the language.

This do not solve problem with heap allocated struct being moved, but is definitively the right direction.

Reply via email to