On Thu, May 11, 2017 at 07:46:24PM -0400, Steven Schveighoffer via Digitalmars-d wrote: [...] > But this still doesn't mean that *all* bool conversions are value > based. In at least the struct and class cases, more than just the bits > are checked. [...]
Wait, what? You can use a *struct* as a bool condition?! I tried this: import std.stdio; struct S {} void main() { S s; if (s) { writeln("WAT"); } } But the compiler (rightly) said: test.d(5): Error: expression s of type S does not have a boolean value Or were you talking about structs that define opCast!bool? (In which case it's certainly intentional and doesn't pose a problem.) I can see classes being usable in conditions, though, since they're essentially pointers hiding behind an abstraction. Still, it doesn't quite sit right with me. For example: class C { } class D { bool opCast(T : bool)() { return false; } } void main() { C c; D d = new D; if (!c) { ... } // OK, expected semantics if (!d) { ... } // *** What happens here? } Whereas had the last two lines been written: if (c is null) { ... } if (d is null) { ... } the intent would be much clearer. (And of course, d would be usable without "is null" if you actually intended to invoke opCast!bool.) T -- In a world without fences, who needs Windows and Gates? -- Christian Surchi