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();
}
´´´