看来如果我有一个转换操作符到引用,该操作符将优先于转换为bool
。为什么会发生这种情况,我该如何解决?为什么转换为参考会干扰转换为bool?
(如果它的事项,我使用GCC 4.5我在ideone验证了同样的行为被发现与GCC-4.7.2。)
假设如下:
class B {
protected:
const int a_;
int b_;
B (int b, int a) : a_(a), b_(b) {}
public:
operator bool() const { return b_ == a_; }
};
class D1 : public B {
public:
D1 (int b = 0, int a = 0) : B(b, a) {}
operator int() const { return b_; }
};
class D2 : public B {
public:
D2 (int b = 0, int a = 0) : B(b, a) {}
operator int &() { return b_; }
};
然后,假定它们是在一个简单的程序中使用这样的:
int main() {
if (D1 d1a = D1('a', 'a')) std::cout << "d1a\n";
if (D1 d1b = D1('b', 'a')) std::cout << "d1b\n";
if (D2 d2a = D2('a', 'a')) std::cout << "d2a\n";
if (D2 d2b = D2('b', 'a')) std::cout << "d2b\n";
return 0;
}
该程序的输出是:
d1a
d2a
d2b
请注意,d1b
不在输出中,这意味着转换为bool
的工作方式与我预期的相同,为D1
。但是,对于D2
,似乎转换为参考类型优先于bool
转换。为什么发生这种情况?是否可以对D2
进行简单的更改以允许bool
转换优先于if
检查?
目前,我使用D1
并添加了赋值运算符来实现引用的行为。
嗯,是的,我同意我可能应该能够自己发现这一点,但是除了惩罚我对我来说糟糕的一天之外,是否还有更多的投票原因呢? – jxh