Erreur du compilateur C2316
'class_type' : ne peut pas être intercepté, car le destructeur et/ou le constructeur de copie sont inaccessibles ou supprimés
Une exception a été interceptée par valeur ou par référence, mais le constructeur de copie, l’opérateur d’affectation ou les deux étaient inaccessibles.
Notes
Les modifications de conformité dans Visual Studio 2015 ont fait que cette erreur s’applique aux instructions de capture incorrectes des exceptions MFC dérivées de CException
. Étant donné que CException
possède un constructeur de copie privée hérité, la classe et ses dérivés ne peuvent pas être copiés et ne peuvent pas être passés par valeur, ce qui signifie également qu’ils ne peuvent pas être interceptés par valeur. Les instructions catch qui ont intercepté les exceptions MFC par valeur ont précédemment conduit à des exceptions non interceptées au moment de l’exécution. À présent, le compilateur identifie correctement cette situation et signale l’erreur C2316. Pour résoudre ce problème, nous vous recommandons d’utiliser les macros TRY/CATCH MFC plutôt que d’écrire vos propres gestionnaires d’exceptions. Si cela n’est pas approprié pour votre code, interceptez les exceptions MFC par référence à la place.
Exemple
L’exemple suivant génère l’erreur C2316 et montre un moyen de le corriger :
// C2316.cpp
// compile with: /EHsc
#include <stdio.h>
struct B
{
public:
B() {}
// Delete the following line to resolve.
private:
// copy constructor
B(const B&) {}
};
void f(const B&)
{
}
int main()
{
try
{
B aB;
f(aB);
}
catch (B b) // C2316
{
printf_s("Caught an exception!\n");
}
}