在c ++中运算符重载的问题

时间:2013-03-13 19:10:17

标签: c++ operators

我的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)

问题是在下一行中,变量res上调用了Variant :: int()强制转换操作符并抛出异常,即使所有操作数都是Variants,Variant :: +操作符也不会被调用。我可以看到)

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

然而在下一行中,正确的Variant :: +运算符被调用,而且一切都很好

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

我只是注意到简单地将乘法放在一个临时变量变量(如tempv = Variant(res1)* res2)中,并且分两步完成,但我无法理解为什么。 } 任何人都可以建议什么会导致编译器尝试自动转换为int?我缺少经营者吗?

2 个答案:

答案 0 :(得分:3)

Variant operator +(Variant &v)

应该是

Variant operator +(const Variant &v)

未调用operator+的原因是Variant(res1)创建的临时值无法绑定到非const参数Variant &v

答案 1 :(得分:0)

“Variant :: + operator永远不会被调用” - 因为这是异常工作的方式,在引发异常之后,try {}块的其余部分被跳过并且控制转到catch(...){}阻止