On Tuesday, 9 November 2021 at 02:43:55 UTC, jfondren wrote:
On Tuesday, 9 November 2021 at 02:41:18 UTC, jfondren wrote:
The expectation is probably that `f.move` set `f` to `Foo.init`, but the docs say:

Posted too fast. Foo qualifies with its @disable:

```d
struct A { int x; }
struct B { int x; @disable this(this); }

unittest {
    import core.lifetime : move;
    auto a = A(5);
    auto b = B(5);
    a.move;
    b.move;
    assert(a == A(5));
    assert(b == B(0));
}
```

Yes it should qualify so it should be cleaned out when moved.
When I change:

```D
auto ref unwrap(EX)(auto ref EX res) {
    printf("unwrap()\n");
    return res.get();
}
```

I get:

```
~this(0)
~this(0)
~this(0)
unwrap()
~this(42)
~this(0)
~this(42)
```

So the destructor isn't called from `gen()` -> there is [NRVO](https://dlang.org/glossary.html#nrvo) in play.

Also `pragma(msg, __traits(isRef, res));` prints false in unwrap in this case (which is expected), but how it gets there as a value when it's not moved and instead copied even though it has disabled copy constructor?
`isCopyable!(Value!Foo)` returns false as expected too.

Reply via email to