如何解决抛出后不需要返回 - 标准或编译器特定?
如果我有这样的功能
int f()
{
//something
if ()
{
//something
return 1;
}
throw std::runtime_error("msg");
}
在 Visual Studio 中编译正常并按预期工作,但是在 throw 之后我不需要 return 语句是标准的事情,还是会导致其他编译器出现错误?
解决方法
您遗漏了一个重要的细节,这就是:这也可以编译而不会出现编译器错误
int f_wrong() {} // Wrong!
它不会产生编译器错误,但调用函数会调用 undefined behavior。
当它从不使用 false
参数调用时,这也是“ok-ish”:
int f_still_wrong(bool x) {
if(x) return 42;
}
通常我们希望编写在运行时不会导致未定义行为的代码。当函数缺少返回值时您收到的编译器警告可以帮助解决这个问题。
话虽如此,重要的是是否存在函数结束后不返回的路径。在
的情况下int f_ok(bool x) {
if (x) return 42;
throw 42;
// (1)
}
有两种可能:1) 返回 42,2) 抛出,堆栈展开,throw
之后的语句不执行。函数没有返回值就无法返回。 (1)
是无法访问的代码,将 return
放在 (1)
处可能会产生误导,并且编译器可能会警告无法访问的代码。函数 f_ok
没问题。
return
之后的 throw
将是无法访问的代码。它永远不会被执行。
抛出后,当前函数的执行被中止,除非异常被捕获。因此,将永远不会到达未捕获的抛出之后的任何代码,从而使 return
变得多余。
它有两种作用:在同一个执行分支中返回后的 throw 同样无法访问——这两个语句都将终止函数的执行。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。