Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
não pode ser usado
__tryem funções que exigem desenrolamento de objetos
Observações
O erro C2712 pode ocorrer se você usar /EHsc, e uma função com manipulação de exceção estruturada 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 tenham destruidores. Não utilize SEH em construtores ou destruidores
Compilar sem /EHsc
O erro C2712 também pode ocorrer se você chamar um método declarado usando a __event palavra-chave. Como o evento pode ser usado em um ambiente multithreaded, 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 SEHtry-finally. Consequentemente, o erro C2712 ocorrerá se você chamar o método de evento e passar pelo valor um argumento cujo tipo tem um destruidor. Uma solução neste caso é passar o argumento como uma referência constante.
C2712 também pode ocorrer se você compilar com /clr:pure e declarar uma matriz estática de ponteiros para funções em um __try bloco. Um membro estático requer que o compilador use a inicialização dinâmica em /clr:pure, o que implica manipulação de exceções C++. No entanto, o tratamento de exceções C++ não é permitido em um __try bloco.
/clr:pure e /clr:safe opções de compilador são obsoletas no Visual Studio 2015 e não são suportadas no Visual Studio 2017.
Exemplo
O exemplo a seguir gera 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) {}
}