On Wednesday, 26 June 2013 at 05:08:07 UTC, Jonathan M Davis wrote:
On Wednesday, June 26, 2013 06:59:14 cal wrote:
On Wednesday, 26 June 2013 at 04:06:05 UTC, Jonathan M Davis

wrote:
> Yeah, that should work for the conditions in if, while, and > for
> loops but
> won't work for anything else (_maybe_ ternary operators, but
> I'm not sure).
> So, if you need to be able to do !obj in the general case,
> that's not going to
> work

...

import std.stdio;

struct S {
   int x;
   bool opCast(T)() if (is(T == bool)) {
     return x == 0;
   }
}

void main() {
   auto s = S(1);
   auto b = !s;
   writeln(b);  // true
}

Is this not supposed to work?

No, it's not. That would require an implicit cast (which requires using alias this). opCast gives you an explicit cast only. Where that becomes confusing is the fact that the compiler inserts explicitly casts to bool in conditions for
if statements, loops, and the ternary operator. e.g.

if(foo) {...}

becomes

if(cast(bool)foo) {...}

So, if you've overloaded opCast to bool, then it'll get used in the conditions for if statements, loops, and the ternary operator. But no explicit cast is added just for putting ! in front of a variable. It works with something like

if(!foo) {...}

simply because that becomes

if(!cast(bool)foo) {...}

But nothing special is done for !, and !a will not call opCast.

- Jonathan M Davis

But that code I posted does work, and gives the output shown. Am I misunderstanding?

Reply via email to