makeIndex not working

Jonathan M Davis jmdavisProg at gmx.com
Sun Jul 3 00:05:38 PDT 2011


On 2011-07-02 19:42, Adam D. Ruppe wrote:
> Jonathan M Davis wrote:
> > The range has to be mutable.
> 
> Is there any easy way around this, aside from casting away
> the outer immutable?
> 
> It's a very annoying limitation that doesn't really have to be
> there - I believe the language itself would let you pass immutable
> int[] to a regular function that expects immutable(int)[], since the
> outermost reference is passed by value anyway.

The problem is how the type is determined with templates. The _exact_ type is 
used. So, instead of generating a function which takes immutable(int)[], the 
compiler generates a function which takes an immutable int[], because you 
passed it an immutable int[], not an immutable(int)[]. And it doesn't work to 
iterate over an immutable int[], so the function fails to compile. It's the 
same reason why you can't use static arrays with range-based functions unless 
you slice them. They don't work when the type is a static array, since you 
can't pop elements off of a static array.

If the compiler were smart enough to use immutable(int)[] instead of immutable 
int[], and to use a dynamic array instead of a static one when choosing the 
type for the template, then the problem would be solved. But it isn't that 
smart. There are at least a couple of enhancement requests which relate to the 
issue, and it may be resolved at some point, but as long as the compiler uses 
the _exact_ type given for the template even when a more relaxed type would 
work, you're not going to be able to pass immutable arrays or static arrays to 
templated functions.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list