On Wednesday, 30 January 2019 at 20:13:56 UTC, Alex wrote:
Given this:

´´´
import std.experimental.all;

void main(){}

static assert(isInputRange!(ReturnType!(produceS!(42))[]));

auto produceS(size_t param)() { return S!param(); }
struct S(size_t param)
{
    //@disable this(this);
    auto opIndex() { return produceRange!(this); }
}

auto produceRange(alias source)(){ return Range!source(); }

struct Range(alias source)
{
    size_t front();
    void popFront();
    bool empty();
}
´´´

Why disabling copying of S removes the range property of Range?

Ok... strange... it doesn't in fact... as this works:

´´´
import std.experimental.all;

void main()
{
    S!42 s;
    auto res = s[];
    static assert(isInputRange!(typeof(res)));
    res.front.writeln;
}

//static assert(isInputRange!(ReturnType!(produceS!(42))[]));

auto produceS(size_t param)() { return S!param(); }
struct S(size_t param)
{
    auto myParam(){return param; }
    @disable this(this);
    auto opIndex() { return produceRange!(this); }
}

auto produceRange(alias source)(){ return Range!source(); }

struct Range(alias source)
{
    size_t front(){return source.myParam;}
    void popFront();
    bool empty();
}
´´´

Reply via email to