struct construction (how?)
Ali Çehreli
acehreli at yahoo.com
Mon Dec 28 07:40:58 PST 2009
bearophile wrote:
> Ali Çehreli:
>> auto s = S(1, 2);
Doesn't work for structs that have opCall (or maybe an opCall with
matching parameters to that use).
> And by the way, that's the idiomatic way to initialize a struct in D.
Excellent! That's the way I have chosen and have been using in my D
tutorial. :)
I had included a warning against the C-style initializers; good to see
that they are gone at least for structs with constructors. Since there
is also '=void', I think the {} should still default initialize the
remaining members (like C and C++).
One issue remains, which prompted me to open this thread in the first place:
I wanted to experiment with defining opCall for that struct:
struct S
{
int x;
int y;
const int opCall(int p0, int p1)
{
return p0 + p1;
}
}
This does not compile anymore:
auto s = S(1, 2);
s(3, 4); // hoping to call opCall
But compiler error instead:
Error: function expected before (), not s of type int
See, the type of 's' is 'int', meaning that S(1,2) is not a constructor
but a call to opCall. (This behavior documented on the struct spec page.)
Here is a consistent deduction of that behavior:
- S(1,2) is always the opCall
- if the programmer doesn't define an opCall, the automatic one is
called and the automatic one initializes the members
That is of course my deduction of the current behavior. I don't know
what part of that is by design. (?)
Also, I have no clue why we would ever want to use the type name as
function call syntax as in S(1,2). Coming from C++, I can understand
s(3,4)... :)
Thank you,
Ali
More information about the Digitalmars-d-learn
mailing list