Simen kjaeraas simen.kjaras at
Mon Jan 24 15:32:38 PST 2011

Robert Clipsham <robert at> wrote:

> On 24/01/11 23:09, Ellery Newcomer wrote:
>> in the following:
>> void main(){
>> char[] x;
>> string s;
>> string y;
>> y = s ~ x;
>> }
>> tok.d(5): Error: cannot implicitly convert expression
>> (cast(const(char)[])s ~ x) of type char[] to string
>> why should typeof(s ~ x) == char[] ?
> x is a mutable array of mutable chars
> s is a mutable array of immutable chars
> If you append something mutable to something immutable, the resulting  
> type must be mutable, as some of the contents is mutable and could be  
> changed - if that can happen the result can't be immutable. To get  
> around this there's .idup I believe.

That is actually a very good argument in favor of const(char)[] as the
result type.

See, for a given T[] and immutable(T)[], where T is or holds pointers,
the immutability invariant would be broken if the result type were T[],
and the conversely, elements might change from under you if the result
were immutable(T)[].

For T where T has and holds no pointers/references, unique(T)[] would
be the best, if the language supported it.

This would give us this constancy chart:
     /     \
mutable immutable
     \     /

Where the elements on each layer can be implicitly converted to those
below it. Functions could then return unique results when the return
type can be proven to be unique.

There are complications to such a scheme though, but I'm not gonna
enumerate those right now.


More information about the Digitalmars-d-learn mailing list