On Mon, 16 Aug 2010 19:06:56 -0400, Simen kjaeraas <simen.kja...@gmail.com> wrote:

Jonathan M Davis <jmdavisp...@gmail.com> wrote:

On Monday, August 16, 2010 15:31:23 Steven Schveighoffer wrote:
We can move onto the next test:

Given:

class C {}

class D : C {}

convert Array!D into Array!(const C)

OK, maybe this is a more advanced test :)

I'd be happy with just proper factoring of const to be honest.

Um, I don't think that I've ever seen that work in _any_ language, and I'm not sure that it would be a good thing if it did. Array!D is a completely different type from Array!C or Array!(const C). I could see an argument that Array!D should work as Array!(const D), but that seems off to me. Converting Array!D to
const (Array!D) should work though.

Uhm, it works in D:

class C {}
class D : C {}

void main( ) {
     D[] a;
     C[] b = a;
}

Yes, I was about to say that except that is a bug kind of. The type system should only allow casting D[] to const(C)[].

See http://d.puremagic.com/issues/show_bug.cgi?id=2095

But aside from that, the test is invalid, I don't think D* can implicitly cast to C* (I'm not sure). This might be a built-in array-only thing. The compiler is going to be hard-pressed to get that one right anyways, as it involves changing types as Jonathan said.

This kind of thing is tricky to get right.

BTW, I thought about it more, and I don't think Rebindable!(const(Array!V)) is going to work. The public interface that rebindable exposes is the const version, and you want to expose the const version only for the references, and expose the mutable version for the values. Rebindable only allows reassigning the whole struct at once.

I feel more and more strongly that this has to be a compiler solution. A library solution may eventually be possible, but it's going to be very nasty/tricky to write. I wouldn't be surprised if using a library tail const type adds 10K to the executable size for each type it's used on...

-Steve

Reply via email to