【发布时间】:2013-07-11 21:40:58
【问题描述】:
如果我有一个引用的转换运算符,这个运算符将优先于转换为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 并向其添加赋值运算符以实现引用的行为。
【问题讨论】:
-
嗯,是的,我同意我自己可能应该能够发现这一点,但是除了因为我今天过得不好而惩罚我之外,还有更重要的理由来否决投票吗?
标签: c++