Ошибка об удаленном операторе bool, когда static_cast to int - PullRequest
0 голосов
/ 09 февраля 2019

При выполнении static_cast<int> я получаю жалобу об удаленном операторе bool ():

main.cpp:15:35: error: use of deleted function 'J::operator bool()'
     j = static_cast<int>(*this) + 1;
                               ^

Возможно, что-то очевидное, что я здесь упускаю, но я не понимаю, почему этобудет пытаться запустить преобразование bool:

#include <iostream>

struct J {
    int j;
    J (int j) : j (j) {}

    operator bool() = delete;

    explicit operator int() const {
        if (j > 304) { std::cout << "Out of range\n"; }
        return j;
    }

    J& operator++ () {
        j = static_cast<int>(*this) + 1;
        return *this;
    }
};

int main() {
    J b {1020};
    ++b;
}

1 Ответ

0 голосов
/ 09 февраля 2019

Короче говоря, изменение перегрузок оператора 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.Таким образом, он разрешается с удаленным, прежде чем перейти к постоянному.

...