Type inference and overloaded functions
Jonathan M Davis
jmdavisProg at gmx.com
Mon Dec 9 23:15:27 PST 2013
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.
- Jonathan M Davis
More information about the Digitalmars-d-learn
mailing list