const?? When and why? This is ugly!

Ary Borenszweig ary at esperanto.org.ar
Sun Mar 8 08:01:27 PDT 2009


Derek Parnell escribió:
> On Sat, 07 Mar 2009 23:40:52 -0800, Walter Bright wrote:
> 
>> I'm still not understanding you, because this is a contrived example 
>> that I cannot see the point of nor can I see where it would be 
>> legitimately used.
> 
> I can see Burton's concern, and I'm very surprised that the compiler allows
> this to happen. Here is a slightly more explicit version of Burton's code.
> 
> import std.stdio;
> void main()
> {
>   int [] a = new int [1];
> 
>    a [0] = 1;
> 
>    invariant (int) [] b = cast (invariant (int) []) a;
> 
>    writef ("a=%s b=%s\n", a [0], b[0]);
>    a [0] += b [0];
>    writef ("a=%s b=%s\n", a [0], b[0]);
>    a [0] += b [0];
>    writef ("a=%s b=%s\n", a [0], b[0]);
> }
>    
> The problem is that we have declared 'b' as invariant, but the program is
> allowed to change it. That is the issue.

As I see it, the cast should fail saying "can't cast a to invariant 
because a is mutable", because otherwise you are producing a behaviour 
that doesn't match what the code says.

In:

char c;
int* p = cast(int*)&c;
*p = 5;

there's nothing wrong about the cast because a char can be viewed as an 
int. But a mutable data cannot be seen as immutable.

Walter, you say "Whenever you use a cast, the onus is on the programmer 
to know what they are doing." That's true. But if the programmer made a 
mistake and she wasn't knowing what she was doing, the compiler or the 
runtime should yell.

For example:

class A { }

class B : A { }

class C : A { }

void foo(A a) {
   C c = cast(C) a;
}

The programmer is sure "a" is really of type "C". If it is, ok, 
everything works. Now, assuming it is not, this yields a null "c" which 
fails at runtime if "c" is used (which will be used eventually because 
that's why we are casting it). The failure is a big one: the program 
halts. (well, I'd prefer an exception to be thrown, but that's another 
issue). Now, if you allow a cast from mutable to immutable to continue, 
the error at runtime will be very subtle and really hard to find, 
because the program will continue to work but with a wrong behaviour.



More information about the Digitalmars-d mailing list