Многие люди, без сомнения, знакомы с шаблоном Mr. Alexandrescus ScopeGuard (теперь частью Loki) и новой версией ScopeGuard11, представленной здесь: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-C
с исходным кодом здесь: https://gist.github.com/KindDragon/4650442
В своем выступлении на С++ и после 2012 года он упомянул, что не смог найти способ правильно определить, была ли удалена область из-за исключения. Поэтому он не смог реализовать макрос SCOPE_FAIL, который выполнил бы предоставленную лямбду (обычно используемую для обратного кода) тогда и только тогда, когда область завершилась из-за исключения. Это приведет к тому, что функция члена() будет отключена и сделает код более удобочитаемым.
Поскольку я отнюдь не гений или опыт, как г-н Alexandrescu, я ожидаю, что реализация SCOPE_FAIL не так проста:
~ScopeGuard11(){ //destructor
if(std::uncaught_exception()){ //if we are exiting because of an exception
f_(); //execute the functor
}
//otherwise do nothing
}
Мой вопрос, почему бы и нет?