std.range.interfaces : InputRange moveFront
Ali Çehreli
acehreli at yahoo.com
Fri Dec 1 18:20:40 UTC 2017
On 12/01/2017 01:11 AM, Johan Engelen wrote:
> I tested it and it works like you wrote, but the behavior is different
> for an array of integers...:
>
> auto a = [ 1,2,3 ];
> writeln(a.front); // 1
> auto b = a.moveFront();
> writeln(b); // 1
> writeln(a.length); // still 3
> writeln(a.front); // still 1
>
> -Johan
Good catch, which affects my struct S example as well.
It's a documentation bug as it does not mention different behavior
depending on elaborate copy constructor:
https://github.com/dlang/phobos/blob/master/std/range/primitives.d#L1848
ElementType!R moveFront(R)(R r)
{
static if (is(typeof(&r.moveFront)))
{
return r.moveFront();
}
else static if (!hasElaborateCopyConstructor!(ElementType!R))
{
return r.front;
}
else static if (is(typeof(&(r.front())) == ElementType!R*))
{
import std.algorithm.mutation : move;
return move(r.front);
}
else
{
static assert(0,
"Cannot move front of a range with a postblit and an
rvalue front.");
}
}
Ali
More information about the Digitalmars-d-learn
mailing list