В С++ есть два оператора & и &&. Первый — побитовый, т.е. логическая операция И применяется ко всем битам операндов. При это гарантируется вычисление правого операнда. А вот второй — логический. Он воспринимает операнды по принципу ноль (false) - не ноль (true) и в результате мы получаем либо ноль (false), либо единицу (true). При этом, если значение левого операнда false, следовательно вся операция будет иметь результат false и правый операнд даже не будет вычисляться. Проще говоря, для bool надо использовать &&, а для int — &.