コンパイラ エラー C2712
オブジェクト アンワインディングが必要な関数内で
__try
を使用できません。
解説
/EHsc
を使用していて、構造化例外処理の関数にアンワインディング (破棄) を必要とするオブジェクトも含まれている場合、エラー C2712 が発生することがあります。
考えられる解決策:
SEH を必要とするコードを別の関数に移動します。
デストラクターを含むローカル変数とパラメーターを使用しないように、SEH を使用する関数を記述し直します。 コンストラクターまたはデストラクターで SEH を使用しないようにします。
/EHsc を使用せずにコンパイルします。
__event
キーワードを使用して宣言されたメソッドを呼び出すと、エラー C2712 が発生する場合もあります。 イベントがマルチスレッド環境で使用される場合もあるため、基になるイベント オブジェクトの操作を防止するコードがコンパイラにより生成され、生成されたコードが SEH の try-finally
ステートメントで囲まれます。 その結果、イベント メソッドを呼び出し、型にデストラクターが含まれる引数を値渡しで渡すと、エラー C2712 が発生します。 このような場合の解決策の 1 つとして、引数を定数参照として渡します。
/clr:pure
を使用してコンパイルし、__try
ブロックでポインターから関数への静的配列を宣言する場合も、C2712 エラーが発生することがあります。 静的メンバーの場合、コンパイラが /clr:pure
以下で動的な初期化を使用する必要があります。これにより C++ の例外処理が暗黙的に指定されます。 しかし、__try
ブロックでは C++ の例外処理を実行できません。
/clr:pure
および /clr:safe
コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 ではサポートされていません。
例
次の例では、C2712 を生成し、その修正方法を示しています。
// 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) {}
}