endsWith() doesn't work with const(wchar[])s

Steven Schveighoffer schveiguy at yahoo.com
Fri Jan 14 05:22:41 PST 2011


On Fri, 14 Jan 2011 02:21:03 -0500, %u <wfunction at hotmail.com> wrote:

>> Regardless, a fully const array is never going to work with a function  
>> like
> endsWith() for the simple reason that such functions have to actually be  
> able to
> process the range that they're given, and if the range is const, you  
> can't call
> popFront() or popBack() on it, so it just isn't going to work.
>> Now, if you take a _slice_ of a const array, it should work, because  
>> while the
> elements of the array will remain const, the slice itself won't be, so  
> endsWith()
> can process it.

The issue is that IFTI uses exactly the type used to call it.

void foo(T)(T t)
{
    writeln(typeid(T));
}

const(int[]) x = [1,2,3];
foo(x); // prints const(int[])

What you really want is for IFTI to strip down const/immutable on arrays  
and basic types.  I think it's a bugzilla bug somewhere, if not it's  
definitely been discussed on the phobos mailing list.

>
> I see what's happening, but the problem with slicing is that it doesn't  
> prevent a
> resize of the array, which, if not allocated with GC memory, could break  
> code. How
> can you have a non-resizeable slice, while still maintaining the  
> constness of an
> array? Is that even possible?

Since 2.041, this cannot happen.  A resize of a slice where data will be  
overwritten from the original array always results in a reallocation.

-Steve


More information about the Digitalmars-d mailing list