Error about @disabled constructor when there is a custom one
Minas Mina
minas_mina1990 at hotmail.co.uk
Wed Jan 23 08:18:33 PST 2013
On Wednesday, 23 January 2013 at 12:07:48 UTC, monarch_dodra
wrote:
> On Wednesday, 23 January 2013 at 11:03:45 UTC, Minas Mina wrote:
>> Why is it required to have the .init property? Where is it
>> useful and why was this decision made?
>
> .init is very useful in the sense that it represents the raw
> object, *statically*.
>
> This is useful for declaring statics.
>
> It also makes constructors straightforward, in a simple 2 pass
> scheme (copy T.init, then run constructor).
>
> More importantly, the T.init state is also the one you are
> supposed to have post destruction (Or at least, calling a
> destructor on T.init is supposed to be safe). This allows for
> some *very* efficient and built-in move semantics:
>
> To move a into b, simply destroy b, memcopy a into b, memcopy
> T.init over a.
>
> Notice how massively simpler this is compared to C++'s explicit
> Rvalue references? I *dare* you to try doing that with C++.
>
> "DEFAULT" constructor breaks this entire scheme, as it implies
> that T.init is not an object's natural state. It jeopardizes a
> static destructible state.
>
> The problem is that this overlaps with having an "explicit
> constructor that takes no arguments". This is particularly
> problematic for objects that have pointers to payloads that
> represent "shallow" objects. AA's is a prime example of this:
>
> //----
> void insert5(int[int] i)
> {
> i[5] = 5;
> }
>
> int[int] a; //Un-initialized T.init state
> int[int] b = [1 : 1]; //initialized
> int[int] c = [1 : 1]; c.remove(1); //Empty but initialized
> insert5(a);
> insert5(b);
> insert5(c);
> assert(a is null); //Oh no!
> assert(b == [1 : 1, 5 : 5]); //5 correctly appended
> assert(c == [5 : 5]); //5 correctly copied
> //----
>
> In this example, I had to jump through loops to initialize c.
Really good explanation. Thank you. So @disabled default
constructor was just a "side effect" of doing those that you
described.
More information about the Digitalmars-d
mailing list