Кажется, что если у меня есть оператор преобразования в ссылке, этот оператор будет иметь приоритет перед преобразованием в 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
и добавляю к нему оператор присваивания для достижения поведения ссылки.