Короче говоря, изменение перегрузок оператора bool на одно из следующих:
explicit operator bool() = delete; // Prevent implicit conversion (int to bool)
operator bool() const = delete; // Non-const had higher priority for resolution
Это примерно две вещи.Неявное целочисленное преобразование и порядок разрешения функций.
Кажется, что это в основном типичное разрешение функций C ++.Давайте вспомним, что:
class A {
public:
void foo() { cout << "non-const" << endl; }
void foo() const { cout << "const" << endl; }
};
int main() {
A a1;
a1.foo(); // prints "non-const"
const A a2;
a2.foo(); // prints "const"
return 0;
}
Если доступен неконстантный, он имеет более высокий приоритет, чем константный.
Вернемся к вашему примеру, давайте проясним ситуацию, изменим бросок boolоператор к неконстантному int cast.
explicit operator int() = delete; // Instead of "operator bool() = delete;"
При этом он по-прежнему не работает по той же причине, что и выше.Так как operator++
не является константой, то this
не является константой, поэтому static_cast<int>(*this)
разрешается в неконстантную operator int
.Однако он удаляется, поэтому компилятор жалуется.Так что, если бы мы не удалили этот неконстантный файл, он был бы разрешен с помощью константной версии и работал бы правильно.
Так что теперь с operator bool() = delete;
?Эта функция не объявлена с explicit
, поэтому int
будет неявно пытаться преобразовать в bool
.Таким образом, он разрешается с удаленным, прежде чем перейти к постоянному.