我有一个简短的代码,仅出于练习目的而创建,我想检查一下如果我有两个catch部分,一个是按引用捕获($('#startDate').datetimepicker({
format: 'dd MM yyyy'
});
$('#endDate').datetimepicker({
format: 'dd MM yyyy',
useCurrent: false //Important! See issue #1075
});
),第二个是按值捕获,那将会发生什么(int&
)。问题是,当我运行此代码时,即使我抛出了“常规”整数,似乎仍发生了按引用捕获。为什么会这样?
注意:在MSVS17上编译时,出现错误C2313:
'int':在第15行被引用('int&')捕获
但是当我使用在线编译器时,它就可以正常工作。
当我删除一个catch部分时,即使在MSVS17中它也可以正常工作,但是,为什么要调用具有引用而不是另一个引用的catch部分
int
答案 0 :(得分:5)
catch
匹配中没有优先级。 catch
匹配或不匹配。引用是匹配的。
当复合语句中的任何语句抛出类型E的异常时,它都会按照catch子句的列出顺序与handler-seq中每个catch子句的形式参数T的类型进行匹配。
即选择第一个匹配项(没有概念“更好”或“更差”匹配; catch
要么匹配,要么不匹配。)
进一步说:
如果满足以下任一条件,则为匹配项:
- ...
- T是对E的左值引用(可能是cv限定)
- ...
因此,catch(int&)
是一个匹配项; catch(int)
甚至没有机会被考虑。
马丁·邦纳(Martin Bonner)提供了一个很好的例子,可以让您理解这一点,而操作人员则可以完全理解:
try {
throw 5;
}
catch (int) { // int first
// ...
}
catch (int&) { // this is not even considered!
// ...
}