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

Don't need a return after throw - standard or compiler specific?

如果我有这样的功能

int f()
{
   //something
   if ()
   {
      //something
      return 1;
   }

   throw std::runtime_error("msg");
}

In Visual studio in 编译正常并按预期工作,但是抛出后我不需要 return 语句是标准的事情吗,或者它可能导致其他错误编译器?

throw 之后的 return 将是无法访问的代码。它永远不会被执行。

抛出后,当前函数的执行被中止,除非异常被捕获。因此,将永远不会到达未捕获的抛出之后的任何代码,从而使 return 变得多余。

它有两种方式:在同一个执行分支中 return 之后的抛出同样不可到达——这两个语句都将终止函数的执行。

您遗漏了一个重要的细节,这就是:此外,这将在没有编译器错误的情况下编译

int f_wrong() {}  // Wrong!

它不会产生编译器错误,但调用该函数会调用 undefined behavior

此外,当它从未使用 false 参数调用时,这也是“ok-ish”:

int f_still_wrong(bool x) {  
     if(x) return 42;
} 

通常我们希望编写的代码不会在运行时导致未定义的行为。当一个函数缺少一个 return 时你得到的编译器警告可以帮助解决这个问题。

话虽这么说,但重要的是在没有 returning 的情况下是否存在函数末尾的路径。在

的情况下
int f_ok(bool x) {
     if (x) return 42;
     throw 42;
     // (1)
}

有两种可能性:1) 它 returns 42,2) 它抛出,堆栈展开并且不执行 throw 之后的语句。如果没有 return 值,函数就无法 return。 (1) 是无法访问的代码,将 return 放在 (1) 处可能会产生误导,编译器可能会警告无法访问的代码。函数f_ok没问题