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; } ```