www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - struct field initialization

reply bitwise <bitwise.pvt gmail.com> writes:
If I define a non-default constructor for a struct, are the 
fields initialized to T.init by the time it's called? or am I 
responsible for initializing all fields in that constructor?

..or do structs follow the same rules as classes?
https://dlang.org/spec/class.html#field-init

   Thanks
Aug 16 2017
next sibling parent reply kinke <noone nowhere.com> writes:
On Wednesday, 16 August 2017 at 18:11:05 UTC, bitwise wrote:
 If I define a non-default constructor for a struct, are the 
 fields initialized to T.init by the time it's called?
The struct instance is initialized with T.init before invoking the constructor.
Aug 16 2017
parent bitwise <bitwise.pvt gmail.com> writes:
On Wednesday, 16 August 2017 at 18:17:36 UTC, kinke wrote:
 On Wednesday, 16 August 2017 at 18:11:05 UTC, bitwise wrote:
 If I define a non-default constructor for a struct, are the 
 fields initialized to T.init by the time it's called?
The struct instance is initialized with T.init before invoking the constructor.
Thanks for the quick response. In regards to my second question, the "value = T(args);" variant seems to work, even with a const T, without calling a postblit - so I guess that's what I'll use.
Aug 16 2017
prev sibling parent bitwise <bitwise.pvt gmail.com> writes:
On Wednesday, 16 August 2017 at 18:11:05 UTC, bitwise wrote:
 [...]
I'm asking this because I need to forward args to a container's node's value. Something like this: struct Node(T) { int flags; T value; // maybe const this(Args...)(int flags, auto ref Args args) { this.flags = flags; // this? emplace(&value, args); // or this? value = T(args); // ? } } struct Container(T) { Node!T[] nodes; void add(Args...)(auto ref Args args) { int flags = 1234; auto p = cast(Node!T*)malloc(Node!T.sizeof); nodes ~= emplace(p, flags, args); } }
Aug 16 2017