digitalmars.D - Regarding opCast(bool) class method
- bearophile (67/67) Nov 08 2012 I think that now and then it's good to underline some D issues,
- Regan Heath (12/20) Nov 09 2012 I don't like it, it restricts people from defining a class which
- bearophile (6/7) Nov 09 2012 Yes, I have several requests that cause tiny breaking changes
I think that now and then it's good to underline some D issues,
even old ones.
This little program shows the asymmetry in opCast(bool) between
struct instances and class instances:
struct FooStruct {
int x;
this(int xx) { this.x = xx; }
T opCast(T: bool)() {
return this.x != 0;
}
}
class FooClass {
int x;
this(int xx) { this.x = xx; }
T opCast(T: bool)() {
return this.x != 0;
}
}
void main() {
import std.stdio;
enum int N = 0;
auto fstruct = FooStruct(N);
if (fstruct)
writeln("fstruct true");
else
writeln("fstruct false"); //*
if (cast(bool)fstruct)
writeln("cast(bool)fstruct true");
else
writeln("cast(bool)fstruct false"); //*
auto fclass = new FooClass(N);
if (fclass)
writeln("fclass true"); //*
else
writeln("fclass false");
if (cast(bool)fclass)
writeln("cast(bool)fclass true");
else
writeln("cast(bool)fclass false"); //*
}
The output:
fstruct false
cast(bool)fstruct false
fclass true
cast(bool)fclass false
Is this situation a problem?
If in your code you convert a struct to class or the other way,
and it contains an opCast(bool), you will have troubles. And
generally I don't like how opCast(bool) works in classes, I think
it's a bit bug-prone. I think "if(fclass)" and
"if(cast(bool)fclass)" should always have the same boolean value.
If this situation is a problem, then here are two of the possible
solutions:
- Do not allow opCast(bool) in classes. How much often do you
need cast(bool) on class instances?
- Keep cast(bool) in classes, and remove the asymmetry between
structs and classes, if possible. So "if(fclass)" on a class
instance calls opCast(bool). Then to test the value of the
reference you use "if(fclass is null)".
See also my issue on this:
http://d.puremagic.com/issues/show_bug.cgi?id=3926
More info on related matters in C++/C++11:
http://en.wikipedia.org/wiki/C%2B%2B11#Explicit_conversion_operators
http://www.artima.com/cppsource/safeboolP.html
http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool
Bye,
bearophile
Nov 08 2012
On Thu, 08 Nov 2012 23:04:17 -0000, bearophile <bearophileHUGS lycos.com> wrote:If this situation is a problem, then here are two of the possible solutions: - Do not allow opCast(bool) in classes. How much often do you need cast(bool) on class instances?I don't like it, it restricts people from defining a class which represents a boolean value/state (and casting it to bool).- Keep cast(bool) in classes, and remove the asymmetry between structs and classes, if possible. So "if(fclass)" on a class instance calls opCast(bool). Then to test the value of the reference you use "if(fclass is null)".This is a breaking change. A slightly less breaking change would be to make "if (fclass)" into both a reference !is null check and a call to any opCast(bool) if it exists. This would then only break existing code using "if (fclass)" on references to classes which define opCast(bool) (which return false). R -- Using Opera's revolutionary email client: http://www.opera.com/mail/
Nov 09 2012
Regan Heath:This is a breaking change.Yes, I have several requests that cause tiny breaking changes open in Bugzilla, since years, and they often have had no comments for years. Sometimes breaking little things is better. Bye, bearophile
Nov 09 2012








"bearophile" <bearophileHUGS lycos.com>