看來如果我有一個轉換操作符到引用,該操作符將優先於轉換爲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