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:

supõe-se que o compilador deve cuidar de desenrolar a pilha?ou, está dizendo que depende do compilador se deve ou não relaxar a pilha?

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 desenrolada

Portanto, 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?

questionAnswers(1)

yourAnswerToTheQuestion