Class member initialization with new points to a single instance?

Gregor Mückl gregormueckl at gmx.de
Wed Jun 9 18:12:01 UTC 2021


On Wednesday, 9 June 2021 at 18:04:54 UTC, evilrat wrote:
> On Wednesday, 9 June 2021 at 17:56:24 UTC, Gregor Mückl wrote:
>> Consider the following code:
>>
>> ```d
>> class Foo {  }
>>
>> class Bar { Foo foo = new Foo(); }
>>
>> void main()
>> {
>> 	Bar b1 = new Bar();
>> 	Bar b2 = new Bar();
>>
>> 	assert(b1.foo != b2.foo);
>> }
>> ```
>>
>> The assert fails. This is completely surprising to me. Is this 
>> actually expected?
>
> By design.
> What you see is CTFE instance shared through class member 
> initializer.
>
> Use Bar ctor instead if you want them to be unique.
>
> Yep, confusing for the first time.

My two cents:

I think this should be changed because all other common languages 
that support equivalent syntax have settled on runtime 
initialization for this. But it's probably too deeply embedded 
into the language now. :(



More information about the Digitalmars-d-learn mailing list