Boost logo

Boost Users :

From: Jean-Pierre Bergamin (james_at_[hidden])
Date: 2008-05-14 05:22:03


Peter Bartlett schrieb:
> Quoting Jean-Pierre Bergamin <james_at_[hidden]>:
>
>> Hello boost-users
>>
>> I just ran into quite a bad issue with boost::tribool. The overloaded
>> operators && and || may (and normally do) evaluate the righthand side of
>> logical expressions although not needed/permitted. They i.e. evaluate the
>> rhs expression in a conjunction where the first term is false.
>>
>> This leads of course to very surprising results. IMHO, the provided
>> operators should be removed or should honor normal semantics.
>> Shall I issue a bug-report? I think the current situation is quite
>> unconvincingly.
>>
>
> Such overloaded operators can't honour "normal" semantics, so that
> option is out. On the other hand, removing the operators would
> substantially undermine the whole idea of the tribool class... so I
> don't think that could be done either. I was surprised though that a
> "usual" cautionary note about such overloaded operators doesn't appear
> in the docs though.. perhaps you could add a bug report or patch for
> that?
>
The real problem lies in the implicit conversion to bool, which does not
obviously let you think that an overloaded && operator is used and code
like if (p != NULL && p->returnsTribool()) will definitivley be used
without hesitation.

As you said, there's no way to emulate shortcut evaluation with an
overloaded operator && in this case. An option would be to remove the
implicit conversion to bool at all. The dereference operator could be
(mis)used if conversion to a plain boolean value is needed. The logical
operators then could still be overridden for "tribool operator<tribool,
tribool>&&" to handle the indeterminate state.

Example:
boost::tribool result = do_you_use_boost();
if(*result) {
    cout << "yes" <<endl;
}
else if (!*result) {
    cout << "no" <<endl;
}
else {
    cout << "don't known" <<endl;
}
something *p = new something();
if (p && *(p->returnsTribool()) ) {
    p->someMethod();
}

What do you think?

Regards

James


Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net