You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
Activity
JohelEGP commentedon Nov 4, 2024
FWIW, we already have that syntax you mentioned.
So maybe rather than
r: foward _ = func(x);,it should be
forward r := func(x);for consistency.
[-][SUGGESTION] Allow perfect return capturing `r: foward _ = func()`[/-][+][SUGGESTION] Allow perfect return capturing `r: forward _ = func()`[/+]MaxSagebaum commentedon Nov 4, 2024
You mean
v2in your code example that is marked asdoes not work?If so, that is what I am suggesting. But you are right
forward r: _ = func(x);would be more consistent. I added this to the initial post. Thanks.