Почему C ++ не использует std :: nested_exception, чтобы разрешить выброс из деструктора?
Основная проблема с выбрасыванием исключений из деструктора состоит в том, что в момент вызова деструктора другое исключение может быть «в полете» (std::uncaught_exception() == true
) и так не очевидно, что делать в таком случае. «Перезапись» старого исключения новым будет одним из возможных способов справиться с этой ситуацией. Но было решено, чтоstd::terminate
(или другойstd::terminate_handler
) должен быть вызван в таких случаях.
C ++ 11 представил функцию вложенных исключений черезstd::nested_exception
учебный класс. Эта функция может быть использована для решения проблемы, описанной выше. Старое (неперехваченное) исключение может быть просто вложено в новое исключение (или наоборот?), А затем может быть выброшено это вложенное исключение. Но эта идея не была использована.std::terminate
до сих пор вызывается в такой ситуации в C ++ 11 и C ++ 14.
Итак, вопросы. Была ли рассмотрена идея с вложенными исключениями? Есть ли с этим проблемы? Не изменится ли ситуация в C ++ 17?