Accidentally killing immutable is too easy in D (Was: cast()x - a valid expression?)
Steven Schveighoffer
schveiguy at yahoo.com
Wed Jun 1 14:15:48 PDT 2011
On Wed, 01 Jun 2011 16:42:10 -0400, Nick Sabalausky <a at a.a> wrote:
> "Steven Schveighoffer" <schveiguy at yahoo.com> wrote in message
>> It gets even better:
>>
>> char[] x = "abc".dup;
>>
>> assert(is(typeof(cast(const)x) == const(char[]));
>>
>> I think you may have found a "bug" that should be a feature. It's like
>> dmd is organically growing features that we might need ;) Is this
>> software evolution? Scary!
>>
>> When will dmd decide that human life is a disease to be eradicated?
>> When
>> will the world be dominated by constinators?!!! I fear for my children.
>>
>> All kidding aside, I actually think the syntax makes sense. You are
>> adding/removing modifiers, so just leave the type out of it. The only
>> drawback is, you can't do a cast directly to a tail-const array, but
>> that's not a huge deal, since const(T[]) implicitly casts to const(T)[].
>>
>> I dub this feature "Type Modifier Casting".
>>
>
> It's nice in a way, but it's all based on the way cast handles modifiers.
> And I've always been a bit unconfortable with how that's handled (In
> fact, I
> was just thinking about this yesterday). Specifically, it seems extremely
> bad that it's so incredibly easy to accidentaly cast away things like
> const
> and immutable:
Yes, it would be nice to have the equivalent of static_cast (which doesn't
allow removing const in C++). I think however, we don't need compiler
support for such things. We can probably do this via metaprogramming.
However, having the ability to cast away or to
const/immutable/shared/inout is very close to const_cast in C++. It fixes
the problem where you just want to cast away const but inadvertently end
up switching the type.
We also need a static_cast for objects. Right now, casting to a derived
object involves a dynamic lookup, but if you know that the dynamic lookup
is not necessary, a cast which does not do a dynamic lookup can be much
faster.
For example, I could have a class A that contains a member of type X.
Then you implement B : A and Y : X such that B's member X is always
actually a Y. Re-storing the Y as another member is wasteful, and so is
doing a dynamic cast for every usage of the member.
> Of course, you can probably use some fancy helper templates to make sure
> you
> preserve all modifiers. But needing to do so is just asking for
> mistakes: it
> seems like a huge violation of "make the right way easy, and the wrong
> way
> hard".
I get what you are saying. I would be happy if default cast didn't allow
casting away const or immutable, but I think we would have a difficult
time introducing such a change.
Note however, C++ has good success with static_cast vs the old C-style
cast (which is supported), so there is hope. The more troubling thing is
when you *want* to do a dynamic cast (which can only be done via the
cast(X) style), you can inadvertently remove const or immutable.
-Steve
More information about the Digitalmars-d
mailing list