在执行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;
}
答案 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之前,使用已删除的一个来解决。