Comment #0 by bearophile_hugs — 2010-11-21T18:55:50Z
This D2 program shows that you can't test if a class reference wrapped with Rebindable is null:
import std.typecons;
const class Foo {}
void main() {
auto a = Rebindable!Foo(new Foo);
a = new Foo;
assert(a !is null); // err
}
DMD 2.050 generates:
test.d(6): Error: incompatible types for ((a) !is (null)): 'Rebindable!(const(Foo))' and 'void*'
Is this the currently correct way to do it? (It works):
assert(a.get() !is null); // OK
I have seen the get() method is not documented on the site, so is that a temporary limitation caused by the unfinished "alis this" implementation?
(Issue tagged with "Component: DMD" because I think it's a limit of "alias this").
Comment #1 by bearophile_hugs — 2011-07-30T11:03:08Z
assert(a !is null); is wrong code.
Bug 4773 is now fixed. Now you are allowed to write:
import std.stdio, std.typecons;
const class Foo {
invariant() { writeln("*"); }
}
void main() {
auto a = Rebindable!Foo(new Foo);
a = new Foo;
//assert(a); // calls Foo.invariant()
//assert(cast(bool)a); // doesn't call Foo.invariant();
auto f = new Foo();
assert(f); // calls Foo.invariant()
assert(cast(bool)f); // doesn't call Foo.invariant();
}
So I consider this bug too fixed.
*** This issue has been marked as a duplicate of issue 4773 ***