On 12/10/2013 08:29 AM, Kenji Hara wrote:

This is an intended behavior. An array literal has dynamic array type
*by default*.
But all of literals in D behave as polymorphic.

char c = 'A';   // character literal has char type by default
dchar d = 'A';  // but it may be implicitly typed as wchar/dchar

string str = "hello";
dstring dstr = "hello";  // string literal is implicitly typed as dstring

int[] darr = [1,2,3];
int[3] darr = [1,2,3];   // implicitly typed as int[3]

So, an array literal [1,2,3] is implicitly convertible both to int[] and
int[3].
And, int[3] is more specialized than int[], so overload resolution will
choose the first 'bar'.

Kenji Hara

Match with implicit conversion cannot be what is really happening as otherwise the following call would be ambiguous:


int bar(int[3] arr){
    return 1;
}

int bar(double[] arr){
    return 2;
}

int bar(int[] arr){
    return 3;
}

static assert(bar([1,2,3])==1);

Reply via email to