Многие люди, без сомнения, знакомы с шаблоном г-н Alexandrescus ScopeGuard (теперь часть Локи) и новой версии ScopeGuard11 представлены здесь: http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2012-Andrei-Alexandrescu-Systematic-Error-Handling-in-CПочему Alexandrescu не использует std :: uncaught_exception() для реализации SCOPE_FAIL в ScopeGuard11?
с источником здесь: https://gist.github.com/KindDragon/4650442
В своей речи на C++ и после 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
}
Мой вопрос, почему нет?
Странно, что-то говорит мне, что он должен работать, но если я попробую, 'uncaught_exception()' всегда возвращает 'false'. –
Я смутно помню, как Герб Саттер имел что-то подобное на обратном пути, когда я не могу найти его больше. Может быть, болезнь Альцгеймера;) или я не собираюсь делать правильные вещи. – odinthenerd
Я думаю, что в случае с защитой сферы вы могли бы использовать 'std :: uncaught_exception', так как защита области никогда не будет членом другого класса (и, конечно же, не локальной переменной в деструкторе класса). – Xeo