On Mon, 30 Nov 2009 03:18:27 +0300, Andrei Alexandrescu <[email protected]> wrote:

Denis Koroskin wrote:
On Mon, 30 Nov 2009 02:20:40 +0300, bearophile <[email protected]> wrote:

Andrei Alexandrescu:
c) If a class doesn't define any constructors but does add at least a
non-static field -> undecided.

Does 'undecided' mean 'compile-time error'?"

Bye,
bearophile
I think it means they are not decided whether it should inherit constructors. Back on topic, I do think inheriting constructors is a good idea, even in presence of additional fields (why not?) I also think constructor inheritance could be implemented without any changes to the language the following way:
 this(Args...)(Args args) if (__traits(compiles, super(args)))
{
    super(args);
     // initialize additional fields, if any present
    // and/or do some post-construction logic
}
 Why create new rules? :)

Alas, that doesn't work because of ref and out arguments. I actually think it's a language bug that it's impossible to implement perfect forwarding.

Andrei

Well, intuitively it should be implemented this way:

class Foo { /* a few different ctors */ }

class Bar : Foo
{
    alias super.this this; // the same way you do
// "alias super.someMethod someMethod;" to add someMethod into current scope
}

Unfortunately, this conflicts with alias this feature. If we could rename constructors from "this" to "ctor", we could use it with no ambiguity:

class Bar : Foo
{
    alias super.ctor ctor;

    ctor(Other other)
    {
       // ... shoudn't conflict with existing ctors (or should it?)
    }
}

This would also help getting rid an ugly "__ctor" identifier which is used as placement new:

void[] mem = allocate!(T);

// old style
T.__ctor(mem);

// new style
T.ctor(mem);

Reply via email to