SYCL defines these function objects as:
template <typename T = void> struct logical_and {
T operator()(const T& x, const T& y) const;
};
template <typename T = void> struct logical_or {
T operator()(const T& x, const T& y) const;
};
Whereas ISO C++ defines them both as returning bool. bool makes a lot more sense to me than T, because the operators are defined as returning x && y and x || y.
I suspect this is a bug that arose from copying and pasting other function object definitions, but before writing up the fix I wanted to check whether anybody knew of a reason that things should be defined this way.