Am Mon, 09 Dec 2013 23:15:27 -0800 schrieb Jonathan M Davis <jmdavisp...@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