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

Warum gibt es keinen Funktionstry-Block für Lambda?

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

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

Warum die zweite Variante ist nicht erlaubt?

+0

Ist Version 1 wirklich gültig? – JVApen

+5

@JVApen Ja, das ist es. – DimChtz

+0

@JVApen Es ist vorgesehen, dass Sie einen Konstruktor in einen try-catch-Block schreiben können, der dann alle während der Initialisierung geworfenen Ausnahmen abfangen kann. Da das Objekt bereits zu dem Zeitpunkt initialisiert wird, an dem der Körper des Konstruktors eintritt, ist eine spezielle Syntax erforderlich, um den try-catch-Block außerhalb des Körpers einzugeben. Dies ermöglicht es dem Programmierer, alle notwendigen Bereinigungen für teilweise konstruierte Objekte durchzuführen, bevor die Ausnahme weitergegeben wird, um normal behandelt zu werden. [Objekte, die innerhalb der Funktion deklariert sind, werden bis zum Ende des (der) Fangblocks als gültig betrachtet.] –

Antwort

5

Ursprünglich wurden Funktion-Try-Blöcke eingeführt, um Ausnahmen in Konstruktoren oder Destruktoren von Unterobjekten abfangen zu können. Die Syntax wurde aus Konsistenzgründen auf normale Funktionen erweitert.

Es wäre natürlich möglich, eine solche Syntax für Lambdas einzuführen. Im Gegensatz zu Konstruktoren und Destruktoren gibt es jedoch keinen praktischen Vorteil gegenüber dem bloßen Einschließen des try-Blocks in ein anderes Paar von { }, mit der Ausnahme, dass letzteres viel weniger unklar erscheint.