参照に変換演算子がある場合、この演算子はbool
への変換よりも優先されます。なぜこのようなことが起こり、どのように修正できますか?参照への変換が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
変換よりも優先されたようです。なぜこれが起こったのですか?チェックをif
にすると、bool
の変換が優先されるように、私はD2
に簡単に変更できますか?
現在、D1
を使用しており、割り当ての演算子を追加して参照の動作を実現しています。私にとって
まあ、はい、私はおそらく私が同意これを自分自身に当てはめることができたはずですが、悪い一日を過ごすために私を罰する以外には、投票のためのより大きな理由がありますか? – jxh