Description
With decltype(auto) r = func();
the return from a function can be perfectly captured.
With the change in 0.8, we have now -> foward _ = {...}
for perfect return type forwarding. We could enable the same for perfect capturing. E.g.:
r: forward _ = func(x);
use_r(r);
Edit1:
As @JohelEGP mentioned forward r: _ = func(x);
would be more consistent.
Edit1_end
Why is this required?
If use_r
is declared as use_r: (inout r) = {...}
then the direct return forwarding use_r(func(x))
is not always possible. If func(x)
returns a value it can not be bound to a reference.
My use case:
I kind of need this in the regular expression implementation. My matching context is always captured as an inout
value. I do not want to have copies of this value. For the lookbehind implementation and nested versions of lookbehind and lookforward, I need to convert the context into itself or a reverse context. So one is a reference and one is a new object. For these cases I need decltype(auto) r = ...
.
I circumvented the issue currently by relaxing the inout ctx
to forward ctx
on the generated functions. But then I had to add a hack to prevent forwarding of ctx
by adding a _ = ctx;
at the end of the function.
I tried to find the location in cppfront where this is implemented, but could not find it. With a hint I would be filling to create a PR.