Why no struct default constructors?

Jonathan M Davis jmdavisProg at gmx.com
Sat Feb 12 11:07:38 PST 2011


On Saturday 12 February 2011 10:48:04 Sean Eskapp wrote:
> With the removal of scope classes, the only way of which I know to use RAII
> objects is to use structs. This is fine, but structs aren't allowed default
> constructors! Why is this?

It's because they have to have an init property. _All_ types have an init 
property. It's what they're default initialized to. For bool, it's false. For 
integral types, it's 0. For floating point types, it's NAN. Etc. For classes, 
that's null, so they can have default constructors just fine. However, for 
structs, it must be what the struct's member variables are directly initialized 
to. If you could have an arbitrary default constructor, then you'd have the 
problem of it throwing exceptions as well as it trying to run functions which 
could only be run at runtime. The struct's init value must be known at compile 
time, and it must _always_ be the same. So, it can't involve any functions which 
would have to be run at runtime, and it can't involve anything that would result 
in differing values betwen runs of the default constructor.

There has been some discussion of allowing structs to have limited default 
constructors, but they would still disallow most of the kinds of things that 
people would want to do with a default constructor. init _must_ be known at 
compile time. So, its value is taken from the value that a struct gets when all 
of its member variables have been directly initialized (or default initialized) 
and no constructor has been called.

It _can_ be a bit annoying at times, but it's either that or allow undefined 
struct values, which would be a big problem and go against D's philosophy on 
default initialization.

Since you can't have a default constructor, what you do instead is define a 
static opCall() function for the struct and use that. Then you construct a 
struct (with the name S in this case) like so:

auto s = S();

You're still stuck with the init state if you do

S s;

or if you're dealing with structs in an array and the like (since they're all 
default constructed to the struct's init property). But you can do RAII just 
fine. Personally, I _always_ use this syntax when declaring struct variables:

auto S = S();

So, the situation isn't exactly ideal, but we're kind of stuck, given the 
various constraints that we have to work with.

- Jonathan M Davis


More information about the Digitalmars-d mailing list