Go, D, and the GC

Timon Gehr via Digitalmars-d digitalmars-d at puremagic.com
Wed Oct 7 02:58:59 PDT 2015


On 10/05/2015 12:57 PM, Shachar Shemesh wrote:
> On 05/10/15 13:39, Marc Schütz wrote:
>> On Monday, 5 October 2015 at 09:25:30 UTC, Shachar Shemesh wrote:
>>> What's more, init is used even if you @disable this(). The following
>>> compile and does what you'd expect (but not what you want):
>>> struct S {
>>>    int d;
>>>
>>>    @disable this();
>>>    this( int d ) {
>>>       this.d = d;
>>>    }
>>> }
>>>
>>>
>>> ...
>>>
>>>    S d = S.init;
>>
>> I don't understand this. How is that not what you want, considering that
>> you explicitly told it to use the init value?
>
> One of the basics of C++ is that, if you construct the type correctly,
> then the user of the type cannot use it in a way that will cause
> inconsistencies. Such a use will not compile.
>
> The above shows that you cannot construct such a type in D. The language
> simply does not allow you to cancel a certain feature of the type in
> which you are uninterested.
>
> Please bear in mind that the init might not be called directly.
> Programmer A defines a type that should never be uninitialized (i.e. -
> needs a constructor). Programmer B places an instance of that type
> inside a containing struct. Programmer C uses that containing struct's
> init. Such a problem is not easy to catch, even if programmers A, B and
> C are the same person.
>
> Shachar

struct S{
     @disable this();
     @disable enum init=0;
}

void main(){
     S s; // error
     auto d=S.init; // error
}



More information about the Digitalmars-d mailing list