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