C++ 为什么lambda没有函数try块?

C++ 为什么lambda没有函数try块?,c++,c++11,c++14,language-lawyer,C++,C++11,C++14,Language Lawyer,为什么不允许使用第二个变量?最初,引入函数try块是为了能够捕获子对象的构造函数或析构函数中抛出的异常。为了保持一致性,语法被扩展到普通函数 当然,可以为lambdas引入这样的语法。但是,与构造函数和析构函数相反,简单地将try块封装在另一对{}中没有实际优势,只是后者看起来不那么模糊。@JVApen是的。@JVApen它也可以用于非构造函数函数,在这种情况下,它相当于将函数体包装在try-catch块中,但缩进级别要少一级。它对于在调试版本中记录有关函数状态的信息非常有用,其方式可以很容易地


为什么不允许使用第二个变量?

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


当然,可以为lambdas引入这样的语法。但是,与构造函数和析构函数相反,简单地将try块封装在另一对
{}
中没有实际优势,只是后者看起来不那么模糊。

@JVApen是的。@JVApen它也可以用于非构造函数函数,在这种情况下,它相当于将函数体包装在try-catch块中,但缩进级别要少一级。它对于在调试版本中记录有关函数状态的信息非常有用,其方式可以很容易地在正常版本中禁用,并且不像将try-catch块放在函数体中那样具有侵扰性,但是由于语法看起来很奇怪,它没有那么常见。它会在try-catch中包装lambda初始化吗?可能不会。@t当函数try块还具有另一个特征时-捕获的任何异常都会在
catch
退出时自动重试,异常无法被吞没。与函数体中的
try catch
不同,它只能用于构造函数和析构函数。@RemyLebeau。一个可能的优点是:
const auto x=([]try{…}catch{…})()能够在外部作用域中编写catch块。我对该注释投了赞成票,但后来我意识到这毫无意义。
void foo() try {} catch (...) {}
// OK, function-try-block
[]() try {} catch (...) {} ();
// error: expected ‘{’ before ‘try’
[]() { try {} catch (...) {} } ();
// OK, extra curly braces`