alias this and array popFront: is this a bug?

monarch_dodra monarchdodra at gmail.com
Tue Mar 12 04:28:29 PDT 2013


//----
struct S
{
    int[] r;
    alias r this;
}

void main()
{
    S s;
    s.front(); //OK
    s.popFront(); //No Match
    static assert (isForwardRange!S); //Nope
}
//----

The problem, basically, is that front's signature is (basically):
@property ref T front(T)(T[] a)
     if (isDynamicArray!(T[]))

popFront's signature though is:
void popFront(A)(A a)
     if (isDynamicArray!A)

The problem is that the constraint "isDynamicArray" requires an 
exact match. This means in the case of front, S is converted via 
alias this to int[], and the constraints pass. In the case of 
popFront, however, S is taken directly as is, and the test 
isDynamicArray fails.

I tried changing the signature to popFront, and everything works 
fine all over phobos. (except for a twisted unittest that tested 
popFront specifying the template parameters, but doing that 
sounds like nonsense to me, and is just badly written test).

Does anybody know if there is a reason other than "historical" 
for this?

I find it stange that front and popFront have different 
behaviors, so I think one of either should be "fixed".

IMO, I think accepting the S type makes sense. Thoughts?


More information about the Digitalmars-d-learn mailing list