On Thursday, 30 November 2017 at 06:36:12 UTC, Ali Çehreli wrote:

import std.range;

struct S {
    int i;
    bool is_a_copy = false;
    this(this) {
        is_a_copy = true;
    }
}

void main() {
    auto r =  [S(1)];

    auto a = r.front;
    assert(a.is_a_copy);       // yes, a is a copy
    assert(a.i == 1);          // as expected, 1
    assert(r.front.i == 1);    // front is still 1

    auto b = r.moveFront();
    assert(!b.is_a_copy);      // no, b is not a copy
    assert(b.i == 1);          // state is transferred
    assert(r.front.i == 0);    // front is int.init
}

I tested it and it works like you wrote, but the behavior is different for an array of integers...:

auto a = [ 1,2,3 ];
writeln(a.front); // 1
auto b = a.moveFront();
writeln(b); // 1
writeln(a.length); // still 3
writeln(a.front); // still 1

-Johan

Reply via email to