opCast for classes

Ali Çehreli acehreli at yahoo.com
Tue Mar 12 13:17:32 PDT 2013


On 03/12/2013 01:08 PM, "Luís Marques" <luismarques at gmail.com>" wrote:
 > Hi there,
 >
 > I've been away for a while from the D world, so I guess I missed some of
 > the new things.
 >
 > Regarding opCast, the documentation says:
 >
 > "This only happens, however, for instances of structs. Class references
 > are converted to bool by checking to see if the class reference is null
 > or not."
 >
 > Yet this works:
 >
 > class B
 > {
 > bool v;
 >
 > this(bool v)
 > {
 > this.v = v;
 > }
 >
 > T opCast(T)()
 > {
 > return v;
 > }
 > }
 >
 > unittest
 > {
 > B bfalse = new B(false);
 > B btrue = new B(true);
 > assert(cast(bool) bfalse == false);
 > assert(cast(bool) btrue == true);
 > }
 >
 > Is that a new feature? Can I rely on it? Is it documented somewhere?
 >
 > Thanks! :-)
 >
 > Regards,
 > Luís

I don't know what the intended behavior but there is a distinction 
between automatic vs. implicit. These pass as well:

     assert(bfalse);
     assert(btrue);

So, apparently implicit conversion considers the class variable and 
explicit conversion considers the class object. And this produces a 
compilation error:

     B bnull;
     assert(cast(bool)bnull);

Error: null dereference in function _D6deneme19__unittestL123991_1FZv

Ali



More information about the Digitalmars-d mailing list