将static_cast转换为int时有关删除的布尔运算符的错误

时间:2019-02-09 02:40:40

标签: c++ boolean static-cast

在执行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 :(得分:1)

简而言之,将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;
}

如果有非常量1可用,则其优先级高于常量1。

回到您的示例,让我们弄清楚,将bool cast运算符更改为non-const int cast。

explicit operator int() = delete; // Instead of "operator bool() = delete;"

因此,由于与上述相同的原因,它仍然失败。由于operator++是非常量,所以this是非常量,因此static_cast<int>(*this)被解析为非常量operator int。但是将其删除,因此编译器会抱怨。因此,如果我们没有删除此非const版本,则可以使用const版本解决该问题并正常工作。

那么operator bool() = delete;呢?此函数未使用explicit声明,因此int将隐式尝试转换为bool。因此,在进入const之前,使用已删除的一个来解决。