Type inference and overloaded functions

Marco Leise Marco.Leise at gmx.de
Tue Dec 10 00:32:04 PST 2013


Am Mon, 09 Dec 2013 23:15:27 -0800
schrieb Jonathan M Davis <jmdavisProg at gmx.com>:

> 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
> 

[1,2,3] looks like a static array to me. And if overload
resolution picked the most specialized function it seems
natural to call the int[3] version.
My reasoning being that static arrays can be implicitly
converted to dynamic array, but the reverse is not true. So I
think it would be better to have [1,2,3] be a static array and
keep the current behavoir, no?)

-- 
Marco



More information about the Digitalmars-d-learn mailing list