参照への変換演算子がある場合、この演算子は への変換よりも優先されるようbool
です。なぜこれが起こるのですか? どうすれば修正できますか?
(問題があれば、GCC 4.5 を使用しています。GCC-4.7.2 でも同じ動作が見られることを ideone で確認しました。)
次のことを前提とします。
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
代入演算子を使用して追加し、参照の動作を実現しています。