On Tuesday, 12 March 2013 at 20:17:33 UTC, Ali Çehreli wrote:
On 03/12/2013 01:08 PM, "Luís Marques" <[email protected]>" 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

bool toto = bfalse; // Error: cannot implicitly convert expression (bfalse) of type module.B to bool

So it isn't the implicit cast kickin here, but a 3rd behavior. The kind of behavior that makes D so special and create theses edges cases we all love !

Reply via email to