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