函数try块,但不在构造函数中

Ale*_* C. 8 c++ exception-handling

只是一个简单的问题.两者之间有什么区别吗?

void f(Foo x) try
{
   ...
}
catch(exception& e)
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

void f(Foo x)
{
    try { ... }
    catch (exception& e)
    {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

如果不是,为什么函数尝试块(构造函数的初始化列表的情况被放在一边)?如果复制构造函数Foox传递给异常时抛出异常会发生什么f

CB *_*ley 10

函数try块只在构造函数中需要.在所有其他情况下,通过将函数的整个主体包含在普通的try/catch块中,可以实现完全相同的效果.

如果用于初始化参数的复制构造函数抛出异常,则会在函数调用之前发生.它不能被函数try块或函数中的异常处理程序捕获,因为函数没有被调用.

  • 这意味着非构造函数的函数try块只是一种替代语法,没有语义目的,这可能确实是它们存在的有争议的论据.另一方面,C++中有太多莫名其妙的东西,即使是那些与兼容性无关的东西也是如此. (5认同)

MSa*_*ers 6

有些事情是允许的,因为它们更难以禁止它们.在一些但不是所有函数体上允许函数try块会使语法和编译器更复杂.