Неявное преобразование обоих операндов для оператора ==

Следующий код компилируется и выполняется без ошибок, хотя оператор равенства не определен:

class A {
public:
    operator bool() const { return true; }
};


int main()
{
    A a, b;
    a == b; //why does this compile?
    return 0;
}

Что происходит внутри a == b, так это то, что operator bool() const вызывается для обоих операндов, а затем два логических элемента сравниваются для равенства (это произошло в нашем производственном коде, где class A умный тип указателя и дал семантически сомнительные результаты).

Мой вопрос: какое правило в стандарте С++ допускает неявное преобразование операндов обоих в этом случае? Я могу понять, что операнд один будет неявно преобразован в bool для теста на равенство , если другой операнд уже был bool, но не тот и другой.

Ответ 1

Я могу понять, что один операнд будет неявно преобразован..., но не оба

Тогда вы неправильно поняли. РЕДАКТИРОВАТЬ: По мнению экспертов в комментариях, поиск зависимых от аргументов, похоже, является случаем, когда ваше предположение верно. Но ваш не относится к ADL.

Какое правило в стандарте С++ допускает неявное преобразование обоих операндов

От стандартного черновика:

[over.match] (2.9)

  • Тогда наилучшая жизнеспособная функция выбирается на основе неявных последовательностей преобразования (13.3.3.1), необходимых для сопоставления каждого аргумента с соответствующим параметром каждой жизнеспособной функции.

Мой акцент на "каждый аргумент". Не "один аргумент".