cout<<a==b
аналогично (cout<<a) == b
, поскольку <<
имеет более высокий приоритет над ==
. Теперь cout<<a
будет синтаксически неправильным, если тип a
не поддерживается для <<
. Далее, если a
имеет перегрузку для << operator
, он снова будет синтаксически неправильным, поскольку оператор ==
не может работать с std::stream
и типом b
, если b
не перегружает этот оператор сравнения.
Но в случае cout<<(a==b)
, a==b
приведет к значению boolean
. Поскольку оператор <<
поддерживает значение boolean
, это допустимая операция.