The Status of Const
Steven Schveighoffer
schveiguy at yahoo.com
Tue Aug 17 05:48:23 PDT 2010
On Tue, 17 Aug 2010 06:05:55 -0400, Pelle <pelle.mansson at gmail.com> wrote:
> On 08/17/2010 01:44 AM, Steven Schveighoffer wrote:
>> On Mon, 16 Aug 2010 19:06:56 -0400, Simen kjaeraas
>> <simen.kjaras at gmail.com> wrote:
>>> 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)[].
>
> class C { }
> class D : C { }
> class E : C { }
>
> void append_to(ref const(C)[] cs, const(C) c) { cs ~= c; }
>
> D[] ds;
> append_to(ds, new E);
>
>
> *ahem*
> D[] can not be converted to const(C). That it works today is pretty
> terrible. Rewrite the append_to to work with Objects, and well. :-)
It's a bug also :)
The general rule of thumb is that you can convert a reference to a type to
a reference to a const subtype that's only a one-level reference. *two*
level references cannot be converted, because of the example you showed.
A ref const(C)[] is a two-level reference (reference to array, which is a
reference to a block of const(C)). So you cannot convert a ref const(D)[]
into a ref const(C)[], but converting a const(D)[] into a const(C)[] is ok
because there is only one level of reference before you reach the const
type.
-Steve
More information about the Digitalmars-d
mailing list