我的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?我缺少经营者吗?
答案 0 :(得分:3)
Variant operator +(Variant &v)
应该是
Variant operator +(const Variant &v)
未调用operator+
的原因是Variant(res1)
创建的临时值无法绑定到非const参数Variant &v
。
答案 1 :(得分:0)
“Variant :: + operator永远不会被调用” - 因为这是异常工作的方式,在引发异常之后,try {}块的其余部分被跳过并且控制转到catch(...){}阻止