Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
non può essere usato
__trynelle funzioni che richiedono la rimozione di oggetti
Osservazioni:
L'errore C2712 può verificarsi se si usa /EHsce 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'istruzionetry-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) {}
}