On 12/22/2013 02:19 PM, Benjamin Thaut wrote:
When working with C-libraries in D I often wish for a equivalent of the
C++11 unique_ptr. Unfortunately this is not possible in D. Consider the
following source code:

http://dpaste.dzfl.pl/6e71c815

Is error 1 a bug? Because there should cleary not be any copy at this
point.
...

I don't think the conditions when a struct is moved are actually documented beyond the NRVO case. I think it ideally would be a bug, but this would require some kind of DIP.

Should we implement moving of u so that error 2 goes away? The compiler
could move u into the function and move back out afterwards, but that
would mean that the contents of u would be invalid for the duration of
the function call (unsafe?)

Kind Regards
Benjamin Thaut

The problem is that currently variable 'u' needs to be valid in order to be assigned to. It would be better if it was moved into test2 and then reinitialized.

Currently, structs with disabled default construction and postblit are pretty much useless as value types. One has to include some kind of invalid default state. (As Sergei's implementation also does.) Then it is always possible to use explicit moves:

import core.stdc.stdio;
import std.algorithm;

struct UniquePtr{
    private int m_i;
    private bool _valid=false;
    @property bool valid(){ return valid; }
    @disable this(this);

    this(int i){
        m_i = i;
        _valid = true;
    }

    ~this(){
        if(_valid) printf("deleting %d\n", m_i);
    }
}

UniquePtr test1(){
    auto u = UniquePtr(5);
    return u;
}

UniquePtr test2(UniquePtr u){
    return move(u);
}

void main(string[] args){
    auto u = test1();
    u = test2(move(u));
}

Reply via email to