dmd 2.063 beta 5

Dicebot m.strashun at gmail.com
Fri May 24 00:47:38 PDT 2013


On Thursday, 23 May 2013 at 16:01:56 UTC, Don wrote:
> That's better, but it's still not a convincing example.
>
> I don't see why you cannot remove the intializer, and write:
>
> this(bool IPv6)
> {
>     if (!IPv6)
>       etherType = 0x0800;
>     else
>       etherType = 0x86DD;
>   ...
> }

Because then you will have an invalid default-initialized state. 
For example, in my case static array of Packets can be declared 
and I am guaranteed to have a properly initialized packet 
templates there (constructor can't be used obviously). Now after 
some thinking I favor template-based approach specifically for 
this task but general principle should be clear.

> That only leaves the case where you are bypassing the 
> constructor.

Not "by-passing", more like "not getting to". That it is one of 
subtle and incredibly awesome D features - T.init

> If you have a constructor, but have just used Packet.init, the 
> object is not constructed properly. I cannot see the value in 
> having etherType initialized and everything else not.

I have not mentioned other fields but they are expected to be 
initialized too, thanks to CTFE (don't know how it inter-operates 
with unions in current DMD though). So Packet.init here becomes 
_completely constructed_ Packet with defaults computed at 
compile-time.


More information about the Digitalmars-d-announce mailing list