当进行static_cast<int>
,我收到一个关于删除布尔()运算符投诉:
main.cpp:15:35: error: use of deleted function 'J::operator bool()'
j = static_cast<int>(*this) + 1;
^
可能是一些明显我缺少在这里,但我不明白为什么它会尝试运行的布尔转换:
#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;
}
总之,改变布尔操作符重载到两者之一:
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;
}
如果非const一个是可用的,它具有比常量一个更高的优先级。
回到你的榜样,让我们把事情说清楚,改变布尔类型转换操作符非const int的演员。
explicit operator int() = delete; // Instead of "operator bool() = delete;"
有了这个,仍然失败出于同样的原因上面。由于operator++
是非常量如此this
的非const所以static_cast<int>(*this)
决心非const operator int
。但是它被删除,因此编译器会抱怨。因此,如果我们没有这个非const一个删除时,它会得到解决const版本和正常工作。
所以,现在怎么样operator bool() = delete;
?此功能不explicit
声明所以int
将隐式尝试转换到bool
。因此,越来越为一个常量与之前被删除的一个解决。