Compartilhar via


Erro do compilador C2712

Não é possível usar __try em funções que exigem desenrolamento de objeto

Comentários

O erro C2712 pode ocorrer se você usar /EHsc, e uma função com tratamento de exceções estruturado também tem objetos que exigem desenrolamento (destruição).

Soluções possíveis:

  • Mover código que requer SEH para outra função

  • Reescreva funções que usam SEH para evitar o uso de variáveis locais e parâmetros que têm destruidores. Não usar SEH em construtores ou destruidores

  • Compilar sem /EHsc

O erro C2712 também poderá ocorrer se você chamar um método declarado usando a palavra-chave __event. Como o evento pode ser usado em um ambiente multithread, o compilador gera código que impede a manipulação do objeto de evento subjacente e, em seguida, inclui o código gerado em uma instrução try-finally SEH. Consequentemente, o erro C2712 ocorrerá se você chamar o método de evento e passar por valor um argumento cujo tipo tem um destruidor. Nesse caso, uma solução é passar o argumento como uma referência constante.

O erro C2712 também poderá ocorrer se você compilar com /clr:pure e declarar uma matriz estática de ponteiros para funções em um bloco __try. Um membro estático exige que o compilador use a inicialização dinâmica em /clr:pure, o que implica no tratamento de exceções de C++. No entanto, o tratamento de exceções de C++ não é permitido em um bloco __try.

As opções do compilador /clr:pure e /clr:safe foram preteridas no Visual Studio 2015 e são incompatíveis com o Visual Studio 2017.

Exemplo

O exemplo a seguir gera o erro C2712 e mostra como corrigi-lo.

// C2712.cpp
// compile with: /clr:pure /c
struct S1 {
   static int smf();
   void fnc();
};

void S1::fnc() {
   __try {
      static int (*array_1[])() = {smf,};   // C2712

      // OK
      static int (*array_2[2])();
      array_2[0] = smf;
    }
    __except(0) {}
}