On Thursday, 13 December 2018 at 13:17:05 UTC, aliak wrote:

Ah. Is there any case where you would not want to do that when you have a T value as parameter?

And, what if it's "this()(auto ref T value)"? Then moving could be dangerous if the parameter was passed as a ref. Or maybe it just wouldn't compile?

Here's a version that moves rvalues and either copies lvalues, or fails to compile if it can't:

struct Container(T) {
    T value;
    this(T value) {
        import std.algorithm.mutation : move;
        this.value = move(value);
    }
    import std.traits : isCopyable;
    static if (isCopyable!T) {
        this(ref T value) {
            this.value = value;
        }
    }
}

Full example: https://run.dlang.io/is/0dw6zz

Reply via email to