如果我有这样的函数
int f()
{
//something
if ()
{
//something
return 1;
}
throw std::runtime_error("msg");
}
在Visual studio中,In编译正常,工作正常,但抛出后我不需要返回语句,这是一件标准的事情吗?还是会导致其他编译器出现一些错误?
您缺少一个重要的细节,这就是:同样,这将在没有编译器错误的情况下编译
int f_wrong() {} // Wrong!
它不会产生编译器错误,但调用函数会调用未定义的行为。
这也是";ok ish";当从未使用false
参数调用时:
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
正常。
throw
之后的return
将是不可访问的代码。它永远不会被执行。
抛出后,当前函数的执行将中止,除非捕捉到异常。因此,在未捕获的throw之后的任何代码都将永远无法到达,从而使return
变得多余。
它有两种工作方式:在同一执行分支中返回后的抛出同样是不可访问的——这两条语句都将终止函数的执行。