templated overload of opAssign

tsbockman thomas.bockman at gmail.com
Sun Apr 4 18:05:04 UTC 2021


On Sunday, 4 April 2021 at 16:38:10 UTC, frame wrote:
> On Saturday, 3 April 2021 at 13:46:17 UTC, kdevel wrote:
>> Why does this code
>
>>    ec.opAssign (bar (1)); // okay
>> //   ec = bar (1); // Error: expression bar(1) is void and has 
>> no value
>
>> compile with the abovementioned error?
>
> You cannot assign void returned from bar() as parameter to 
> opAssign(). The lazy keyword creates some internal delegate, 
> thus opAssign() works instead.

Thus, the solution is to use an explicit `delegate` instead of 
`lazy`:

```D
import std.stdio,std.typecons;

struct EC {
    Exception [] ex;
    auto opAssign (X: void delegate()) (scope X f)
    {
       writeln (__PRETTY_FUNCTION__);
       try return f (); catch (Exception e) ex ~= e;
    }
}

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

void main ()
{
    EC ec;

    ec = bar (1); // okay

    ec.writeln;
}
```


More information about the Digitalmars-d-learn mailing list