【问题标题】:Why there is no function-try-block for lambda?为什么 lambda 没有函数尝试块?
【发布时间】:2016-12-13 12:15:53
【问题描述】:
void foo() try {} catch (...) {}
// OK, function-try-block

[]() try {} catch (...) {} ();
// error: expected ‘{’ before ‘try’

[]() { try {} catch (...) {} } ();
// OK, extra curly braces`

为什么不允许使用第二种变体?

【问题讨论】:

  • @JVApen 是的。
  • @JVApen 它也可以用于非ctor函数,在这种情况下它相当于将函数的主体包装在一个try-catch块中,但缩进级别少了一个。它可以用于在调试构建中记录有关函数状态的信息,这种方式可以很容易地在正常构建中禁用,并且不像将 try-catch 块放在函数体中那样具有侵入性,但并不常见,因为语法看起来很奇怪。
  • 它会在 try catch 中包装 lambda 初始化吗?可能不会。
  • @JustinTime function-try-block 还有一个特点 - 当catch 退出时,捕获到的任何异常都会自动重新抛出,异常不能被吞没。不像函数体内的try-catch,它可以。
  • @RemyLebeau 仅适用于构造函数和析构函数。

标签: c++ c++11 c++14 language-lawyer


【解决方案1】:

最初,引入函数尝试块是为了能够捕获子对象的构造函数或析构函数中抛出的异常。为了保持一致性,语法被扩展到普通函数。

当然,可以为 lambda 引入这种语法。然而,与构造函数和析构函数相比,简单地将 try 块包含在另一对 { } 中并没有实际优势,除非后者看起来不那么晦涩。

【讨论】:

  • 一个可能的优势是这样的:const auto x = ([] try {...} catch {...}) (); 能够在外部范围内编写 catch 块。
  • 我赞成该评论,但后来我意识到这毫无意义。
猜你喜欢
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-22
  • 2017-11-21
  • 2011-03-16
  • 2018-04-10
相关资源
最近更新 更多