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)

问题是,在下一行中,变量 res 上调用 Variant::int() 强制转换运算符并引发异常,并且即使所有操作数都是 Variant,就我所见,Variant::+ 运算符也永远不会被调用)

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

而在下一行,正确的 Variant::+operator 被调用,一切都很好

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

我刚刚注意到,只需将乘法放在一个临时变量变量中(如 tempv = Variant(res1) * res2)并分两步进行即可,但我不明白为什么。谁能建议什么会导致编译器尝试自动转换为 int ?我是否缺少操作员或其他什么?

4

2 回答 2

3
Variant operator +(Variant &v)

应该

Variant operator +(const Variant &v)

operator+没有被调用的原因是因为临时创建的Variant(res1)不能绑定到非常量参数Variant &v

于 2013-03-13T19:13:10.243 回答
0

“Variant::+ 运算符永远不会被调用” - 因为这是异常工作的方式,在引发异常后,try{} 块的所有其余部分都被跳过,控制权转到 catch(...){} 块

于 2013-03-13T19:16:03.997 回答