On Tuesday, 10 December 2013 at 07:15:43 UTC, Jonathan M Davis
wrote:
On Monday, December 09, 2013 22:59:49 Ali Çehreli wrote:
On 12/09/2013 10:52 PM, Jonathan M Davis wrote:
> On Tuesday, December 10, 2013 07:47:38 FreeSlave wrote:
>> I just found weird D behavior about inference of array
>> types.
>>
>> Let's suppose we have these overloaded functions:
>>
>> import std.stdio;
>>
>> void bar(const(int[3]) arr)
>> {
>>
>> writeln("static array");
>>
>> }
>>
>> void bar(const(int[]) arr)
>> {
>>
>> writeln("array slice");
>>
>> }
>>
>> // In main we have something like that:
>> int main(string[] args)
>> {
>>
>> bar([1,2,3]);
>> writeln(typeof([1,2,3]).stringof);
>> return 0;
>>
>> }
>>
>> Weird thing is that the static array version of bar is
>> called,
>> but typeof().stringof is int[], not int[3].
>
> Array literals are always dynamic arrays. int[3] is a static
> array.
>
> - Jonathan M Davis
The original question is valid then: [1,2,3] goes to the
static array
overload.
Then AFAIK, that's a bug. The type of array literals is always
a dynamic
array, so they should match dynamic array overloads rather than
static array
overloads, or if they match both due to an implicit conversion,
there should
be an ambiguity error. Choosing the static array overload over
the dynamic one
is just plain wrong.
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