Type inference and overloaded functions
Kenji Hara
k.hara.pg at gmail.com
Mon Dec 9 23:29:02 PST 2013
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
More information about the Digitalmars-d-learn
mailing list