Deprecating this(this)

Steven Schveighoffer schveiguy at yahoo.com
Tue Apr 3 20:51:02 UTC 2018


On 4/3/18 4:26 PM, ag0aep6g wrote:
> On 04/03/2018 05:13 PM, Steven Schveighoffer wrote:
>> Unfortunately, I found out that it's not just "pre-filled with some 
>> values". Member postblits are run before the containing postblit.
>>
>> https://run.dlang.io/is/mt6eGa
>>
>> So this means, the data that is available to the postblit has already 
>> been processed.
> 
> There's a similar situation with constructors: A constructor can call 
> another constructor, which can lead to double initialization of fields.
> 
> Example:
> 
> ----
> class C
> {
>      int x;
>      this() immutable
>      {
>          this(42); /* Initializes x. */
>          x = 13; /* Breaking immutable, or ok? */

IMO, breaking immutable.

>      }
>      this(int x) immutable
>      {
>          this.x = x;
>      }
> }
> ----
> 
> If there's a problem with running two postblits on the same field, then 
> I think constructors probably have similar issue. I'm having a hard time 
> finding a good example, though. One where we could break immutable in an 
> obvious way or some such.

You may NOT want to run a postblit on the member. If all you are going 
to do, for example, is reassign a variable, then running the postblit, 
and then the destructor, just so you can overwrite it is pointless.

But more importantly, if the postblit of the member does something crazy 
like stores a reference to itself as an immutable elsewhere, and then 
the compiler allows overwriting, we now have problems.

I think the better mechanism for immutable copying would be to have a 
copy constructor that starts off with T.init, and is passed the object 
to copy from. That seems to be a direction Andrei is considering.

-Steve


More information about the Digitalmars-d mailing list