Why D is annoying =P
Rob T
rob at ucora.com
Mon Oct 29 10:34:14 PDT 2012
On Sunday, 28 October 2012 at 05:28:20 UTC, H. S. Teoh wrote:
> I have to say I was surprised to find out about this after I
> started
> using D; after first reading TDPL, I had the impression that it
> was
> supposed to do the "right thing" (and the right thing being ==
> on each
> field, which I assumed the compiler would optimize into a
> bitwise
> compare where possible).
>
> Let's fix this.
>
There is a problem with floating point memebers, since nan values
will always compare false.
There's other things in D that bother me, such as how struc
pointers are managed, where they sometimes behave exactly like
class references, but not always. The inconsistent behaviour is a
trap for the programmer to fall into, and it leads to subtle hard
to find errors.
For example:
struct S
{
int a;
~this() {}
}
class C
{
int a;
~this() {}
}
// identical behaviour
auto Sp = new S;
auto Cr = new C;
// identical behaviour
writeln(Sp.a);
writeln(Cr.a);
// identical behaviour
auto Sp2 = Sp;
auto Cr2 = Cr;
writeln(Sp2.a);
writeln(Cr2.a);
// ?
assert(Sp2 == Sp);
assert(Cr2 == Cr);
// different behaviour!
clear(Sp);
clear(Cr);
Last two line compile OK, but clear(Sp) does not invoke the
destructor while clear(Cr) does. clear(*Sp) works, but why allow
clear(Sp) if it's a pointless operation? Is this a bug in the
compiler or with the language design?
Subtle differences like this are very nasty. The code should
behave identically for both the struct pointer and the class
reference, and if this is not poosible for some obscure reason,
then the compiler should fail at the clear(Sp) line.
If I invoke with clear(*Sp) it works, but the inconsistency makes
template code that takes in both a struct or a class impossible
to do (or at best needlessly difficult to do).
--rt
More information about the Digitalmars-d
mailing list