On Thursday, 29 April 2021 at 20:00:23 UTC, novice2 wrote:
i dont understand why (templates too dificult for me yet),
but if i comment "lazy" from T2,
then compiler allow add "nothrow" to "ifThrown"

```d
CommonType!(T1, T2) ifThrown(E : Throwable = Exception, T1, T2)(lazy scope T1 expression, /*lazy*/ scope T2 errorHandler) nothrow
```
https://run.dlang.io/is/KTdd3G

This is because marking a function parameter as `lazy` is just syntax sugar for the following:
```
CommonType!(T1, T2) ifThrown(E: Throwable = Exception, T1, T2)(scope T1 delegate() expression, scope T2 delegate() errorHandler);

string def = "some string";
auto s = format("%d", x).ifThrown({ return def; });
```

Behind the scenes, a `lazy` parameter is not really a value - it's a function that _returns_ a value. The problem is that this function is not `nothrow`, and can't be marked as such (this is arguably a gap in the language). Removing `lazy` changes `errorHandler` to be a plain old value again - which cannot throw an exception, of course - so `ifThrown` can be marked `nothrow`. However, you lose all the benefits of `errorHandler` being lazily computed.

Reply via email to