Следующий код: (Код Coliru)
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include <boost/logic/tribool.hpp>
struct B
{
boost::tribool boo;
void bug ()
{
bool tmp = indeterminate (boo);
std::cout << "tmp = " << std::boolalpha << tmp << "\n";
if (tmp && (boo = should_not_be_called ()) == false) {;}
}
bool should_not_be_called () const
{
std::cout << "BUG, wrong call\n";
abort ();
}
};
int main ()
{
B a;
a.bug ();
}
Выходной сигнал
tmp = false
BUG, wrong call
bash: line 7: 14410 Aborted (core dumped) ./a.out
Я не могу понять, почему this_not_be_called вызывается здесь. Проверенные компиляторы были gcc 4.9 и clang 3.6.
UPDATE:
Я прочитал ответы и сменил строку "if" на
if (tmp && (false == (boo = should_not_be_called ()))) {;}
(Coliru)
Теперь существуют простые типы bool с обеих сторон && оператора, но я все равно получил ту же ошибку. Почему?