Ответ
Перегрузка оператора && в C++ технически возможна, но на практике это считается плохой идеей, так как она нарушает ожидаемую семантику короткого замыкания (short-circuit evaluation).
Проблема: Встроенный оператор && вычисляет правый операнд только если левый операнд равен true. Перегруженный оператор — это обычный вызов функции, поэтому оба аргумента вычисляются полностью до входа в тело функции.
Пример, демонстрирующий разницу:
bool returnsFalse() {
std::cout << "Side effect: returnsFalse calledn";
return false;
}
bool returnsTrue() {
std::cout << "Side effect: returnsTrue calledn";
return true;
}
// Встроенный оператор
if (returnsFalse() && returnsTrue()) {}
// Вывод: "Side effect: returnsFalse called"
// Функция returnsTrue() НЕ вызывается.
// Перегруженный оператор (если бы он существовал для какого-то типа)
// MyClass a, b;
// if (a && b) { ... }
// Обе функции-преобразования для a и b будут вызваны ПЕРЕД вычислением оператора.
Это может привести к неочевидным ошибкам, если правый операнд имеет побочные эффекты (вызов функции, изменение состояния, выделение памяти). Поэтому перегрузку && (и ||, и ,) следует избегать, чтобы не вводить в заблуждение пользователей вашего кода. Для подобной логики лучше использовать именованные методы.