refRange and @disable this(this);

Jacob Carlborg via Digitalmars-d digitalmars-d at puremagic.com
Thu Sep 15 00:11:13 PDT 2016


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


More information about the Digitalmars-d mailing list