On Wednesday, 10 October 2012 at 11:23:11 UTC, Jonathan M Davis wrote:
On Wednesday, October 10, 2012 12:45:20 Don Clugston wrote:
Of course there would be no point.
You have not answered the question. The issue is, WHY can we not
guarantee that that the struct default constructor is called?

I have a vague memory that Walter mentioned a technical difficulty once
but I don't remember anything about what it was.

I can't imagine what it would be.

I know that one of the issues was exceptions, though that could be solved by forcing them to be nothrow. There were others, but I don't remember the details. Certainly, from what I recall, the situation is such that you'd have to restrict a default construtor so thoroughly that it would be pretty much
pointless to have one at all.

Even in the worst case, it would be
possible to run CTFE on the default constructor in order to create .init. This would limit the default constructor to things which are CTFEable, but even that would still be useful for templated structs.

Of what real value is a default construct that must be CTFEable? If you can construct everything at compile time, then you can directly initialize each of the member variables. It's being able to run a default constructor at runtime that's useful, and since init must be known at compile time, you get into the whole issue of needing init when you can't use a default constructor. For default constructors to be of any real value, it would have to be possible to replace all instances of init with a call to the default constructor _at runtime_. As long as you're restricted to CTFE, you might as well just directly initialize the member variables to set the values appropriately in
the init property.

- Jonathan M Davis

Can you please elaborate on where the .init property is being relied on? This is an aspect of D I don't really understand. What's the difference between a no-arg ctor and one with args in relation to this requirement?

Is this used somewhere in template code? I vaguely remember the clear() function is supposed to be related to this.

Personally, I don't agree with Walter's stance on default initialization. An explicit init by the user is IMO better design since it is _explicit_ and therefore documents the programmer's intention in the code itself.
i.e.:
int x = 0; // this is explicit and states my intention
int x; // is it intentionally == 0? Did I forget to set a meaningful value?

Reply via email to