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