D - cast syntax
- Sean L. Palmer (44/44) Nov 19 2001 Is the cast keyword required for casts, or not?
- Walter (4/5) Nov 19 2001 It originally was, then I took it out, now I'm considering putting it ba...
Is the cast keyword required for casts, or not?
What follows is from the D Programming Language, expressions section. It
isn't very clear what exactly the D syntax actually is, especially since the
very last thing is an example of why D doesn't need instanceof, which does
not use the cast keyword:
Sean
Cast Expressions
In C and C++, cast expressions are of the form:
(type) unaryexpression
There is an ambiguity in the grammar, however. Consider:
(foo) - p;
Is this a cast of a dereference of negated p to type foo, or is it p being
subtracted from foo? This cannot be resolved without looking up foo in the
symbol table to see if it is a type or a variable. But D's design goal is to
have the syntax be context free - it needs to be able to parse the syntax
without reference to the symbol table. So, in order to distinguish a cast
from a parenthesized subexpression, a different syntax is necessary.
C++ does this by introducing:
dynamic_cast(expression)
which is ugly and clumsy to type. D introduces the cast keyword:
cast(foo) -p; cast (-p) to type foo
(foo) - p; subtract p from foo
cast has the nice characteristic that it is easy to do a textual search for
it, and takes some of the burden off of the relentlessly overloaded ()
operator.
D differs from C/C++ in another aspect of casts. Any casting of a class
reference to a derived class reference is done with a runtime check to make
sure it really is a proper downcast. This means that it is equivalent to the
behavior of the dynamic_cast operator in C++.
class A { ... }
class B : A { ... }
void test(A a, B b)
{
B bx = a; error, need cast
B bx = cast(B) a; bx is null if a is not a B
A ax = b; no cast needed
A ax = cast(A) b; no runtime check needed for upcast
}
D does not have a Java style instanceof operator, because the cast operator
performs the same function:
Java:
if (a instanceof B)
D:
if ((B) a)
Nov 19 2001
"Sean L. Palmer" <spalmer iname.com> wrote in message news:9tage9$1f0k$1 digitaldaemon.com...Is the cast keyword required for casts, or not?It originally was, then I took it out, now I'm considering putting it back in.
Nov 19 2001








"Walter" <walter digitalmars.com>