On Wednesday, 1 February 2017 at 01:52:40 UTC, Adam D. Ruppe wrote:
On Wednesday, 1 February 2017 at 00:43:39 UTC, bitwise wrote:
Container!int c; // = Container!int() -> can't do this.

Can you live with

Container!int c = Container!int.create();

because D supports that and can force the issue with `@disable this();` which causes compilation to fail any place where it isn't explicitly initialized.

I suppose this works, but to be honest, I wouldn't use it.

I really don't feel like I'm asking to "have my cake and eat it too" by expecting a proper solution for this.

The current behavior doesn't even really make sense.

Example:

struct S  {
    // this(){}
    this(Args...)(auto ref Args args) { writeln("ctor"); }
    ~this() { writeln("dtor"); }
}

void foo(Args...)(auto ref Args args) { writeln("foo"); }

int main(string[] argv) {
    S s;
    S s2 = S();
    foo();
    return 0;
}

outputs:
  foo
  dtor
  dtor

I would expect that I could at least have this() invoked for 's2', but I can't even declare it at all. So while 'S()' looks like a constructor call, it doesn't call one. Instead, the current behavior forces explicit initialization of objects, pointless boilerplate, or unorthodox/unreliable workarounds.

Even more confusingly, the above example prints "foo" but not "ctor", because calling variadic functions with no arguments is fine - except for constructors.

Finally, destructors are currently called on objects which were never constructed. You can't even call what's going on with structs RAII at this point.




Reply via email to