FWIW; user code shouldn't contain __rvalue directly.
You can define a move function like:
   ref T move(T)(ref T value) __rvalue => value;

Then you can do:
  T x = var.move;  // move construction

`forward` can be implemented similarly.

On Thu, 24 Apr 2025 at 18:26, Jiten Devlani via Digitalmars-d <digitalmars-d@puremagic.com> wrote:
I'm exploring the new `__rvalue` expressions, and got stuck while
creating a move constructor for a container(non-copyable) with a
non-copyable container property.

```d
import core.stdc.stdio : printf;
import core.memory : pureMalloc, pureFree;
struct S {
     @("mallocd") ubyte[] p;
     this() @disable;
     this(this) @disable;
     this(ubyte[] p) @nogc @trusted nothrow {
         printf("Base constructor!\n");
         this.p = p;
     }

     this(S rhs) @nogc @trusted nothrow {
         printf("Move constructor!\n");
         p = rhs.p;
         rhs.p = null;
     }

     ~this() pure @nogc @trusted nothrow {
         if (p) {
             pureFree(p.ptr);
             p = null;
         }
     }
}

struct Container {
     S s;
     this() @disable;
     this(this) @disable;
     this(S s) @nogc @trusted nothrow {
         this.s = __rvalue(s);
     }

     this(Container rhs) @nogc @trusted nothrow {
         this.s = __rvalue(rhs.s);
     }
}
```

Above code results in compilation error:
```
<source>(35): Error: struct `example.S` is not copyable because
it has a disabled postblit
         this.s = __rvalue(rhs.s);
```

I've looked into the language reference but could not find a way
to move a property of a rvalue object instance.