On 2016-09-14 14:39, Jerry wrote:
I got a range which disables copy construction and I want to loop the
range within another loop using the same range.
So I thought I can mark the struct range with @disable this(this) and
then use refRange to initialize the loop.

So with something like this:

void main()
{
    auto valueRange = FooRange("123");
    foreach(ch; refRange(&valueRange))
        writeln(ch);
}


struct FooRange {
    @disable this();
    @disable this(this);
    this(string str) {
        this.str = str;
    }

    @property bool empty() { return str.empty; }
    @property dchar front() { return str.front; }
    void popFront() { str.popFront; }

private:
    string str;
}


But I get compile time errors messages saying:
std/range/package.d(8155,23): Error: struct app.FooRange is not copyable
because it is annotated with @disable

It feels strange that refRange ever want to copy.
Bug or feature?

As a workaround you can take the address of the range and use std.algorithm.each:

void main()
{
    auto valueRange = FooRange("123");
    (&valueRange).each!(ch => writeln(ch));
}

With a convenience function:

T* ptr(ref T t){ return &t; }

void main()
{
    auto valueRange = FooRange("123");
    valueRange.ptr.each!(ch => writeln(ch));
}

--
/Jacob Carlborg

Reply via email to