【发布时间】:2021-06-06 18:41:18
【问题描述】:
据说定义一个函数为noexcept会让编译器做一些优化来提升程序,如果函数需要抛出,编译器会抑制优化。
这是我的简单 sn-p:
void func() noexcept(true){
std::vector<int> vec{2, 4, 6, 8}; // vec is a vector of 4 ints
std::cout << vec.at(5); // throws
}
int main(){
try{
func();
}
catch(std::exception const& e){
std::cout << e.what() << '\n';
}
catch(...){
//
}
}
- 为什么我无法捕获异常?我确定是因为
noexcept异常规范。那么,如果一个函数被标记为noexcept但抛出了异常,如何捕获它的异常而不是让程序调用std::terminate()来结束程序呢?
【问题讨论】:
-
func承诺永远不会抛出异常;如果它违反了承诺,将调用std::terminate。您必须更改func的主体才能捕获异常并以另一种方式返回错误。 -
还有这个信息"...如果函数需要抛出编译器会抑制优化..."是不正确的。
-
并直接回答您的评论 -
func已承诺从不抛出,所以 "...might throw..." 是不可能的并且优化(如果有的话)总会发生。 -
@ItachiUchiwa 不,你只是误解了它的意思。 "此外,如果编译器知道不会抛出异常[因为使用了
nothrow(true)],它可以(有时)执行如果代码可能抛出必须抑制的优化[当不使用nothrow(true)时]" -
不,您误解了报价。 "... "此外,如果编译器知道不会抛出异常,..." stop here
noexcept(true)已指定,因此编译器知道不会抛出异常并因此进行优化(如果可能的话)可以执行编译器不会查看func中调用的每个函数,并尝试确定哪些可以抛出,哪些不能。func的作者已经向编译器承诺不会留下任何异常@987654335 @.