On Sunday, 4 April 2021 at 18:05:04 UTC, tsbockman wrote:
```
[...]
You cannot assign void returned from bar() as parameter to opAssign(). The lazy keyword creates some internal delegate, thus opAssign() works instead.
[...]
auto bar (int i) {
    return () {
        if (i == 1)
            throw new E ("E");
    };
}
```

You changed the definition of ``bar`` while the exception collector (``EC``) is meant to catch and collect an exception thrown from the *unmodified* function. It seems that the operator ``+=`` or ``~=`` may be better suited to express that intent. Rewriting this in terms of ``opOpAssign`` works as expected:

```
import std.stdio;

struct EC {
   Exception [] ex;
   auto opOpAssign (string op: "+", X: void) (lazy X f)
   {
      writeln (__PRETTY_FUNCTION__);
      try return f (); catch (Exception e) ex ~= e;
   }
   auto opOpAssign (string op: "~", X: void) (lazy X f)
   {
      writeln (__PRETTY_FUNCTION__);
      try return f (); catch (Exception e) ex ~= e;
   }
}

class E : Exception { this (string s) { super (s); } }
void bar (int i) { if (i == 1) throw new E ("E"); }

void main ()
{
   EC ec;

   ec.opOpAssign!"+" (bar (1)); // okay
   ec += bar (1); // okay
   ec ~= bar (1); // okay

   ec.writeln;
}
```

Reply via email to