Go, D, and the GC

Marc Schütz via Digitalmars-d digitalmars-d at puremagic.com
Mon Oct 5 04:41:08 PDT 2015


On Monday, 5 October 2015 at 10:57:57 UTC, 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.

`@disable this();` works fine to prevent the user from doing that 
accidentally. But in your example, this doesn't happen by 
accident; you explicitly told the compiler to use the .init 
value. That's not something you do just because you can, you need 
to have a reason for it. Presumably a user doing this would know 
what they're doing.

I don't think it's reasonable to expect to be able to prevent 
that, just as you can't forbid the user to do unsafe casts. And 
arguably, if your type's .init is invalid, then "you're doing it 
wrong".

Besides, that every type has a .init value is a very fundamental 
part of the language, not just a feature of a particular type. 
Sure, you use some flexibility for edge cases, but IMO that's a 
good tradeoff for the general advantages you gain from it.

>
> 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.
>

If you use normal declaration, the compiler correctly rejects 
that:

struct A { @disable this(); }
struct B { A a; }
void main() { B b; }

// Error: variable xx.main.b default construction is disabled for 
type B

If you'd use B.init, of course you'd get exactly what you ask 
for, see above.


More information about the Digitalmars-d mailing list