struct construction (how?)

Don nospam at nospam.com
Mon Dec 28 19:01:04 PST 2009


Ali Çehreli wrote:
> 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++).

There's a good chance that C-style struct initializers will be 
completely removed from the language.
It might help to know that struct literals were added at a late stage in 
language development. Before they were added, there were a few hacky 
workarounds in the language and compiler; you may encounter them 
occasionally. Also static opCall was a workaround for not having struct 
constructors.

> 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