Em resposta à entrada tardia de Tim na discussão (que também aborda um dos primeiros comentários de Lev).
Como um dos que defenderam a separação de saída dos destruidores no gráfico de estados (argumento baseado em um caso de uso real, sobre a interação com o mundo real, isto é, E / S), quando foi submetido ao Boost, concordo que pode haver problemas para colocar o exit lógica em destruidores. David Abrahams, sem surpresa, também apresentou argumentos persuasivos em relação à segurança de exceções. Por esses motivos, o Statechart não exige que você coloque lógica nos destruidores - mas permite - com os conselhos habituais.
A lógica que só deve ser executada como parte de uma transição para fora de um estado (não a destruição do objeto do gráfico de estados como um todo) pode (e deve, se houver também limpeza de recursos a fazer) ser separada em uma ação exit () separada.
Para um estado "thin" sem estado ativo (recursos), apenas ações de entrada / saída a serem executadas, você pode executar essas ações no ctor e no d'tor e garantir que o construtor e o destruidor não atinjam. Não há motivo para eles - não há estado para executar a RAII - não há mal em fazer com que o tratamento de erros nesses locais crie eventos apropriados. Talvez você ainda precise considerar se deseja que as ações de saída que alteram o estado externo sejam executadas na destruição da máquina de estado ... e as coloque em ação de saída se não desejar que ocorram nesse caso ...
O Statechart modela a ativação como instanciação de um objeto, portanto, se o seu construtor tem trabalho / ativação / instanciação real a fazer e se é capaz de falhar de modo que o estado não possa ser inserido, o Statechart suporta isso, oferecendo a capacidade de mapear uma exceção para um objeto. evento. Isso é tratado de uma maneira que elabore a hierarquia de estados procurando um estado externo que lide com o evento de exceção, análogo ao modo como a pilha teria se desenrolado para um modelo de chamada baseado em pilha de chamadas.
Tudo isso está bem documentado - sugiro que você leia os documentos e tente. Sugiro que você use destruidores para limpar "recursos de software" e sair de ações para executar "ações de saída do mundo real".
Vale notar que a propagação de exceção é um pouco problemática em todos os ambientes controlados por eventos, não apenas nos gráficos de estados. É melhor raciocinar e incluir falhas / erros no design do gráfico de estados e, se e somente se você não puder lidar com eles de outra maneira, recorra ao mapeamento de exceções. Pelo menos isso funciona para mim - ymmmv ....