D2.0: an example of use-case for casting invariant away

Eugene Pelekhay pelekhay at nospam.org
Thu Jun 21 05:58:02 PDT 2007


Don Clugston Wrote:

> Regan Heath wrote:
> > Walter Bright Wrote:
> >> Don Clugston wrote:
> >>> Walter Bright wrote:
> >>>> With D, you can cast away const-ness, that is legal. But if you 
> >>>> subsequently modify the underlying data, that is undefined behavior.
> >>> It sounds that in D, it will be too easy to cast away constness 
> >>> accidentally.
> >>> With C++, at least you can grep for const_cast and detect potentially 
> >>> dangerous code, and you get a strong visual clue.
> >>> Suppose I've written a D function like this:
> >>>
> >>> void f(int *b, uint c)
> >>> {
> >>>   // maybe I'm avoiding a compiler warning or something.
> >>>   uint *d = cast(uint *)b;
> >>>   d += c;
> >>> }
> >>>
> >>> Months later, I'm refactoring the code, and I convert the int * 
> >>> parameter to an invariant, without recognising that it's changing the 
> >>> value of b. Oops.
> >>>
> >>> C++'s const would catch this mistake, but if I understand correctly, D 
> >>> will compile it without error. Suddenly the function has moved into the 
> >>> realm of undefined behaviour.
> >>>
> >>> I hope I'm wrong. Or did I miss something?
> >> No, you're not missing something. It is a general problem with cast - 
> >> cast is a blunt instrument which can easily hide problems.
> > 
> > So.. we're going to have to put up with this potential nasty bug?
> > 
> > What about a new cast which only removes 'const' and/or 'invariant and prohibit normal cast from removing it.
> > 
> > Perhaps calling it 'vary', eg.
> > 
> > void f(const int *b, uint c)
> > {
> >    int *d = vary() b;
> > }
> 
> To avoid a new keyword...
> 
> int* d = cast(break const) b;

what about?
int* d =cast(!const)b;
> 
> IMHO, we want something that looks really nasty.




More information about the Digitalmars-d mailing list