Hello, is there reason why elements of input range must be copyable?
For example this example works and copy ctor is never called:
import std.algorithm : map;
import std.range;
struct Foo{
int i;
this(scope ref typeof(this) rhs)pure nothrow @safe @nogc{
//this.i = rhs.i;
assert(0, "no copy");
}
@disable this(scope const ref typeof(this) rhs)pure nothrow @safe @nogc;
}
void main(){
Foo[] foos = [Foo(1), Foo(2), Foo(3)];
//this work (copy ctor is never called):
{
auto tmp = foos
.map!((ref foo) => foo.i)
.array;
}
}
This doesn't work:
void main(){
const(Foo)[] foos = [Foo(1), Foo(2), Foo(3)];
//error:
{
auto tmp = foos
.map!((ref foo) => foo.i)
.array;
}
}
Source of my problem is in isInputRange
:
import std.range;
import std.traits : ReturnType;
alias R = const(Foo)[];
//enum bool isInputRange(R) =
static assert(is(typeof(R.init) == R)); ///OK
static assert(is(ReturnType!((R r) => r.empty) == bool)); ///OK
static assert(is(typeof((return ref R r) => r.front))); ///ERROR, copy result of front
static assert(!is(ReturnType!((R r) => r.front) == void)); ///OK
static assert(is(typeof((R r) => r.popFront))); ///OK
Is it possible to make lambda return auto ref
?