2016-08-07 23 views
18
void foo() try {} catch (...) {} 
// OK, function-try-block 

Lambda için neden işlev bloku yok?

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

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

Neden ikinci varyant izin verilmez?

+0

Sürüm 1 gerçekten geçerli mi? – JVApen

+5

@JVApen Evet öyle. – DimChtz

+0

@JVApen Bir kurucuyu bir try-catch bloğuna sarmanıza izin vermek amaçlanmıştır; bu, başlangıç ​​sırasında atılan istisnaları yakalayabilecek; Nesne, kurucunun vücudu girdiği zamandan beri başlatıldığı için, vücut dışında try-catch bloğuna girmek için özel bir sözdizimi gereklidir. Bu, programcının normal olarak ele alınacak olan istisnayı geçmeden önce kısmen inşa edilmiş nesneler için gerekli herhangi bir temizlemeyi yapmasına izin verir. [İşlevin içinde bildirilen nesneler, yakalama blok (lar) ının sonuna kadar kapsam olarak kabul edilir.] –

cevap

5

Başlangıçta, fonksiyon-deneyin-blok Kurucular veya alt nesnelerin yıkıcılar atılmış durumları yakalamak edebilmek için tanıtıldı. Sözdizimi tutarlılık için normal işlevlere genişletildi.

tabii ki, lambdas için böyle sözdizimi tanıtmak mümkün olacaktır. Bununla birlikte, kurucular ve yıkıcılar yerine, diğer bir çift { }'daki try bloğunun basitçe kapatılmasından daha pratik olmayan bir avantaj yoktur;