Errore del compilatore C2712
non può essere usato
__try
nelle funzioni che richiedono la rimozione di oggetti
Osservazioni:
L'errore C2712 può verificarsi se si usa /EHsc
e una funzione con la gestione delle eccezioni strutturata include anche oggetti che richiedono la rimozione (distruzione).
Soluzioni possibili:
Spostare il codice che richiede SEH in un'altra funzione
Riscrivere le funzioni che usano SEH per evitare l'uso di variabili e parametri locali contenenti distruttori. Non usare SEH nei costruttori o nei distruttori
Compilare senza /EHsc
L'errore C2712 può verificarsi anche se si chiama un metodo dichiarato usando la __event
parola chiave . Poiché l'evento può essere usato in un ambiente multithreading, il compilatore genera codice che impedisce la manipolazione dell'oggetto evento sottostante e quindi racchiude il codice generato in un'istruzione SEHtry-finally
. Di conseguenza, l'errore C2712 si verificherà se si chiama il metodo dell'evento e si passa per valore un argomento il cui tipo contiene un distruttore. Una soluzione in questo caso consiste nel passare l'argomento come riferimento costante.
C2712 può verificarsi anche se si compila con /clr:pure
e si dichiara una matrice statica di puntatori a funzioni in un __try
blocco. Un membro statico richiede al compilatore di usare l'inizializzazione dinamica in /clr:pure
, che implica la gestione delle eccezioni C++. La gestione delle eccezioni C++ non è però consentita in un blocco __try
.
Le opzioni del /clr:pure
compilatore e /clr:safe
sono deprecate in Visual Studio 2015 e non supportate in Visual Studio 2017.
Esempio
L'esempio seguente genera l'errore C2712 e mostra come risolverlo.
// 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) {}
}