Overload of ! operator

cal callumenator at gmail.com
Tue Jun 25 22:14:36 PDT 2013


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?


More information about the Digitalmars-d-learn mailing list