D2.0: an example of use-case for casting invariant away
Don Clugston
dac at nospam.com.au
Thu Jun 21 05:25:11 PDT 2007
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;
IMHO, we want something that looks really nasty.
More information about the Digitalmars-d
mailing list