Hello, is there reason why elements of input range must be copyable?

For example this example works and copy ctor is never called:

```d
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:


```d

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`:
```d
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`?

Reply via email to