0

C++ プログラムで演算子が呼び出される順序に奇妙な問題があるようです。引数に基づいて例外をスローするいくつかの演算子を持つクラスを作成しました。

class Variant
{
public:
..stuff..
Variant(int data) {..stuff..}
operator int() throw(...)
{
    if(type == 0)
        return value;
    else
        throw 0;
}
Variant operator +(Variant &v) throw(...)
{
    Variant res;
    if(type == 2) {
        res.value = v.value;
        res.svalue = v.svalue;
..stuff..
        else
            throw 0;
        res.type = type;
    }
    return res;
}
Variant operator *(Variant &v) throw(...) {..stuff..}
}
..stuff..
    int res1;
    Variant res, res2;
..stuff..
//          try {
            if(res1 < 0)

問題は、この次の行で Variant::int() キャスト演算子が変数 res で呼び出され、例外をスローし、Variant::+ 演算子が呼び出されないことです。 )

                res = res + Variant(res1) * res2;
            else

この次の行では、正しい Variant::+operator が呼び出され、すべてがうまくいきます

                res = res + res2;
//          } catch (...) {
//              error = "Invalid operator";
//              isok = false;
//  

掛け算を一時バリアント変数 (tempv = Variant(res1) * res2 など) に入れて 2 つのステップで実行するだけでうまくいくことに気付きましたが、その理由がわかりません。コンパイラが int への自動キャストを試みる原因を誰か提案できますか? オペレーターか何かが不足していますか?

4

2 に答える 2

3
Variant operator +(Variant &v)

する必要があります

Variant operator +(const Variant &v)

youroperator+が呼び出されない理由は、によって作成された一時がVariant(res1)非 const パラメータにバインドできないためVariant &vです。

于 2013-03-13T19:13:10.243 に答える