首页 > 解决方案 > 抛出后不需要返回 - 标准或编译器特定?

问题描述

如果我有这样的功能

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

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

在 Visual Studio 中编译正常并按预期工作,但是在 throw 之后我不需要 return 语句是标准的事情,还是会导致其他编译器出现一些错误?

标签: c++c++11cross-compilingportability

解决方案


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

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)是无法访问的代码,放置returnat(1)可能会产生误导,编译器可能会警告无法访问的代码。功能f_ok还可以。


推荐阅读