Allow this() { } for structs

Q. Schroll qs.il.paperinik at gmail.com
Sat Nov 7 01:39:30 UTC 2020


On Friday, 6 November 2020 at 17:14:27 UTC, IGotD- wrote:
> On Friday, 6 November 2020 at 16:53:32 UTC, Q. Schroll wrote:
>>
>> If T's this() isn't pure, T.init cannot exist.
>
> Why must T.init and this() be the same thing?

The more I think about T.init the more stupid I tend to find it. 
The best example is

     struct S
     {
         Object obj = new Object();
     }

not working as most people expect. There's *one* Object 
allocated, that S.init.obj refers to, and that one Object's 
reference is blitted into every constructed S. One way to get 
different immutable(S) with their own distinct obj is a pure S 
factory returning unique S so that it can be implicitly typed 
immutable; that factory can be static opCall. This is stupid; one 
shouldn't need factories for that. (Factories have their use 
cases, though.) The only other option is an immutable constructor 
(or a constructor suitable for constructing immutable), but since 
being a constructor, it needs a parameter. This is stupid; one 
shouldn't need to add useless parameters to any function, except 
maybe for compatibility with an interface. This isn't near that.

They need not necessarily. I find, it would add unnecessary 
confusion if T.init isn't derived from a this() call. That way, 
at least it is guaranteed that T.init has T's invariants met at 
least locally. (Locally meaning that looking at the object 
isolated, no invariant violation can be derived.) An example for 
a "global" invariant is "no two objects of that type have the 
same id", something that clearly cannot be verified nor refuted 
looking at objects individually.


More information about the Digitalmars-d mailing list