Defaut initialization of structs
Meta
jared771 at gmail.com
Tue Oct 14 22:46:07 UTC 2025
On Tuesday, 14 October 2025 at 00:32:04 UTC, Steven Schveighoffer
wrote:
> On Monday, 13 October 2025 at 14:13:26 UTC, Jonathan M Davis
> wrote:
>> And if a struct defines a static opCall which can be called
>> with no arguments, then
>>
>> S s;
>> auto s = S.init;
>>
>> will properly initialize the struct, whereas
>>
>> auto s = S();
>>
>> will do whatever the static opCall does (and there's no
>> guarantee that the static opCall even returns a value let
>> alone that it returns an S). So, in that situation, you almost
>> certainly don't want to be using S() (and if you do, it's
>> because you know exactly what type you're dealing with and how
>> it will behave).
>
> FYI, one thing I learned which actually quite sucks about
> `opCall`, is that this also tries to call *non-static opCall*.
>
> ```d
> struct S {
> int opCall() => 1;
> }
>
> void main() {
> auto s = S(); // error
> }
> ```
>
> Oh, and add a parameter to opCall? Still tries to call it.
>
> It's one wart I wish we could fix. There's a reason why most
> people don't use opCall, it's just hard to deal with.
>
> -Steve
I reported this bug back in February, and Dennis submitted a pull
request to fix it just yesterday:
https://github.com/dlang/dmd/pull/21973
More information about the Digitalmars-d-learn
mailing list