抛出后不需要返回 - 标准或编译器特定?



如果我有这样的函数

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变得多余。

它有两种工作方式:在同一执行分支中返回后的抛出同样是不可访问的——这两条语句都将终止函数的执行。

相关内容

  • 没有找到相关文章

最新更新