Основное использование, которое я нашел бы для finally
, было бы при работе с кодом C, поскольку другие указали, что ресурс C может использоваться только один или два раза в коде и не стоит включать в структуру, соответствующую RAII. Тем не менее, с лямбдами, кажется, достаточно просто вызвать некоторую пользовательскую логику через dtor, вызывающий объект функции, который мы указываем в самой функции.
Другой вариант использования, который я найду, предназначен для экзотического разного кода, который должен выполняться независимо от того, находимся ли мы в обычном или исключительном пути выполнения, например, при печати метки времени или чего-то еще при выходе из функции, несмотря ни на что. Хотя для меня это такой редкий случай, когда кажется, что излишне иметь языковую функцию просто излишне, и теперь с лямбдами все еще так легко без необходимости писать отдельный класс для этой цели.
По большей части я нашел бы очень ограниченные варианты использования для него способами, которые, кажется, не оправдывают такое большое изменение в языке. Однако моя маленькая несбыточная мечта - это какой-то способ определить внутри dtor объекта, уничтожается ли объект обычным или исключительным путем выполнения.
Это упростило бы средства защиты области действия, чтобы больше не требовать вызова commit/dismiss
для принятия изменений без автоматического отката их при уничтожении защиты области действия. Идея состоит в том, чтобы позволить это:
ScopeGuard guard(...);
// Cause external side effects.
...
// If we managed to reach this point without facing an exception,
// dismiss/commit the changes so that the guard won't undo them
// on destruction.
guard.dismiss();
Чтобы просто стать этим:
ScopeGuard guard(...);
// Cause external side effects.
...
Я всегда считал, что необходимость отстранять охранников прицелов немного неловко, а также подвержен ошибкам, поскольку я иногда забывал их увольнять только для того, чтобы они отменили все изменения, заставив меня на мгновение почесать голову почему моя операция, казалось, вообще ничего не делала, пока я не понял, «ой, я забыл уволить охранника прицела». . Это второстепенная вещь, но в основном я считаю гораздо более элегантным избавиться от необходимости явного снятия с охраны области, что было бы возможно, если бы они могли просто сказать, внутри своих деструкторов, уничтожаются ли они обычными путями выполнения (при которых указать, побочные эффекты должны быть сохранены) или исключительные (в этот момент побочные эффекты должны быть отменены).
Это самая незначительная вещь, но в самой сложной области исключительной безопасности, чтобы получить право: откат внешних побочных эффектов. Я не мог просить больше от C ++, когда дело доходит до уничтожения локальных ресурсов должным образом. Это уже идеально подходит для этой цели. Но откатить внешние побочные эффекты всегда было трудно на любом языке, который позволяет им возникать в первую очередь, и любая небольшая помощь, чтобы сделать это легче, вот что я всегда ценю.