auto ref function parameter causes that non copyable struct is copied?

jfondren julian.fondren at gmail.com
Tue Nov 9 02:41:18 UTC 2021


On Tuesday, 9 November 2021 at 02:19:28 UTC, Stanislav Blinov 
wrote:
> On Monday, 8 November 2021 at 23:26:39 UTC, tchaloupka wrote:
>
>> ```
>> auto gen() {
>>     Foo f;                   // <--- this one
>>     f.n = 42;
>>     return value(f.move());
>> }
>>
>> void main() {
>>     Foo f;
>>     f = gen().unwrap.move;
>> }
>> ```
>> ~this(0)
>> ~this(0)
>> ~this(0)
>> ~this(42) <- this is a copy (that shouldn't exist) being 
>> destroyed
>> ~this(0)
>> ~this(42)
>
>
> Is it a copy? I think the first destructor call is one of `f` 
> in `gen` (marked by the comment above)

The expectation is probably that `f.move` set `f` to `Foo.init`, 
but the docs say:

"If T is a struct with a destructor or postblit defined, source 
is reset to its .init value after it is moved into target, 
otherwise it is left unchanged."

```d
struct A { int x; }
struct B { int x; 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));
}
```


More information about the Digitalmars-d-learn mailing list