A pilha é desenrolada com exceções garantidas pelo padrão c ++?
Com relação ao desenrolar da pilha, o padrão c ++ diz:
Uma exceção é considerada não detectada após a conclusão da inicialização do objeto de exceção ([except.throw]) até a conclusão da ativação de um manipulador para a exceção ([except.handle]). Isso inclui o desenrolamento da pilha.
àspar 15.5.3 do padrão atual. Eu estava tentando entender qual a frase mais recente (This includes stack unwindings
) refere-se a:
A questão surge do seguinte trecho:
#include <iostream>
#include <exception>
struct S{
S() { std::cout << " S constructor" << std::endl; }
virtual ~S() { std::cout << " S destructor" << std::endl; }
};
void f() {
try{throw(0);}
catch(...){}
}
void g() {
throw(10);
}
int main() {
S s;
f();
//g();
}
Agora:
se você executá-lo como está (capturando a exceção), você tem uma dica da pilha desenrolandose você comentarf();
e descomentarg();
(sem capturar a exceção), você tem uma dica de que a pilha não está sendo desenroladaPortanto, os dois experimentos parecem ser a favor da primeira bala acima; o clang ++ e o g ++ concordam com o resultado (mas não é um discriminante).
Além disso, parece-me muito estranho que o padrão, que é realmente cuidadoso ao especificar o objetotempo ao vivo eduração está deixando uma sombra aqui.
Alguém pode esclarecer? A pilha é desenrolada para exceções não capturadas garantida pelo padrão? Se sim onde? Se não, por que?