Skip to content

[SUGGESTION] Allow perfect return capturing r: forward _ = func() #1332

Open

Description

@MaxSagebaum

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

  1. JohelEGP commented on Nov 4, 2024

    @JohelEGP
    Contributor

    FWIW, we already have that syntax you mentioned.

    I just noticed that we also don't have decltype(auto) for variables.
    The best approximation are forward: _ parameters: https://cpp2.godbolt.org/z/MKsocP6bb.

    -- #921 (comment)

    So maybe rather than
    r: foward _ = func(x);,
    it should be
    forward r := func(x);
    for consistency.

  2. changed the title [-][SUGGESTION] Allow perfect return capturing `r: foward _ = func()`[/-] [+][SUGGESTION] Allow perfect return capturing `r: forward _ = func()`[/+] on Nov 4, 2024
  3. MaxSagebaum commented on Nov 4, 2024

    @MaxSagebaum
    ContributorAuthor

    You mean v2 in your code example that is marked as does 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.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions