digitalmars.D - Problem with opCast(bool) for classes
- bearophile (39/39) Mar 09 2010 This extended post comes from a note I've written in the announce group ...
- bearophile (2/3) Mar 09 2010 Sorry, I meant:
This extended post comes from a note I've written in the announce group that
was ignored.
A opCast(bool) operator present in struct is called automatically in a if(x),
but the same is not true if x is a class. So for example if you modify your
code changing a struct into a class, other parts of the program will silently
stop working (it usually return true if the class reference is not null). This
is a problem.
This shows the situation:
import std.stdio: writeln;
struct FooStruct {
int x;
T opCast(T:bool)() {
return this.x != 0;
}
}
class FooClass {
int x;
this(int xx) { this.x = xx; }
static FooClass opCall(int xx) { return new FooClass(xx); }
T opCast(T:bool)() {
return this.x != 0;
}
}
void main() {
enum int N = 0;
auto fstruct = FooStruct(N);
if (fstruct)
writeln("fstruct true");
else
writeln("fstruct false"); // fstruct false
auto fclass = FooClass(N);
if (fclass)
writeln("fclass true"); // fclass true
else
writeln("fclass false");
if (cast(bool)fclass)
writeln("fclass true");
else
writeln("fclass false"); // fclass false
}
A possible simple solution is to selectively disallow opCast(bool). So that
conversion of struct to class raises a compile time error that helps avoid the
bugs. But this makes it impossible to have cast(bool) on classes.
Another possible solution is to not remove opCast(bool) from classes and have
if(fclass) call opCast(bool) for classes too, avoiding the asymmetry between
structs and classes. But this requires to write if(fclass is null) to test for
the reference status. This can be an acceptable solution.
Bye,
bearophile
Mar 09 2010
A possible simple solution is to selectively disallow opCast(bool).Sorry, I meant: A possible simple solution is to selectively disallow opCast(bool) for classes.
Mar 09 2010








bearophile <bearophileHUGS lycos.com>