c++ - 抛出后不需要返回 - 标准或编译器特定?
问题描述
如果我有这样的功能
int f()
{
//something
if ()
{
//something
return 1;
}
throw std::runtime_error("msg");
}
在 Visual Studio 中编译正常并按预期工作,但是在 throw 之后我不需要 return 语句是标准的事情,还是会导致其他编译器出现一些错误?
解决方案
您遗漏了一个重要的细节,那就是:此外,这将在没有编译器错误的情况下编译
int f_wrong() {} // Wrong!
它不会产生编译器错误,但调用该函数会调用未定义的行为。
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
at(1)
可能会产生误导,编译器可能会警告无法访问的代码。功能f_ok
还可以。
推荐阅读
- java - 如何使用 jsoup 解析特定的表数据?
- java - javasql异常导致ResultSet关闭后不允许操作
- javascript - 动态设置多个 setInterval(s) 并存储以供以后访问
- linux - PostgreSQL 错误:无法打开文件“base/.../...”
- solr - 意外删除“id”字段 solr
- java - 休眠和中断异常
- java - 给定一个数据集
是否有一个 API 函数需要一个 Row 来添加一个列?
- python - 如何在python代码中使用whois
- python - 二值图像的细化算法和后处理
- python-2.7 - ImportError:没有名为 dtracedata 的模块