抛出后不需要 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
没问题
如果我有这样的功能
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
没问题