November 11, 2020
Hello,
Why does expression 'foo = bars[][0].foo' work but 'foo = bars[].front.foo' doesn't?

example:


class Foo{}

struct Bar{
	Foo foo;
}

void main()@safe{
	import std;

    Foo foo;
    scope Bar[] bars = [Bar.init];

    foo = bars[][0].foo;		//OK, WHY?
    foo = bars[].front.foo;		//Error: scope variable bars assigned to foo with longer lifetime
}
November 11, 2020
Or similar problem:

class Foo{}

struct Slice{
    Foo[] data;

    this(return scope Foo[] data)@safe {
        this.data = data;
    }
    Slice opSlice()@safe return scope{
        return Slice(data);
    }
    Foo opIndex(size_t i)@safe return scope{
        return data[i];
    }
}

void main()@safe{
    Foo foo;
    scope Slice slice = Slice([new Foo]);

    foo = slice[][0];		//OK, Why?
    foo = slice[].opIndex(0);	//Error: scope variable slice assigned to foo with longer lifetime
}