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

Reply via email to