Хорошая ли идея перегружать оператор && в C++?

«Хорошая ли идея перегружать оператор && в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Перегрузка оператора && в 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 будут вызваны ПЕРЕД вычислением оператора.

Это может привести к неочевидным ошибкам, если правый операнд имеет побочные эффекты (вызов функции, изменение состояния, выделение памяти). Поэтому перегрузку &&||, и ,) следует избегать, чтобы не вводить в заблуждение пользователей вашего кода. Для подобной логики лучше использовать именованные методы.