Peter Bartlett schrieb:
Quoting Jean-Pierre Bergamin
: 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