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) {}
}