コンパイラの警告 (レベル 1) C4382

'type' をスローします: __clrcall デストラクターを伴う型、またはコピー コンストラクターは /clr:pure モジュールでのみキャッチできます

解説

/clr:pure コンパイラ オプションは Visual Studio 2015 では非推奨とされており、Visual Studio 2017 ではサポートされていません。

(/clr:pure ではなく) /clr でコンパイルされている場合、例外処理では、ネイティブ型のメンバー関数が __clrcall ではなく __cdecl であることが想定されます。 __clrcall 呼び出し規約が使用されているメンバー関数を持つネイティブ型は、/clr でコンパイルされたモジュール内ではキャッチできません。

/clr:pure を指定してコンパイルされたモジュールで例外がキャッチされる場合は、この警告を無視してもかまいません。

詳細については、「/clr (共通言語ランタイムのコンパイル)」を参照してください。

次の例では C4382 が生成されます。

// C4382.cpp
// compile with: /clr /W1 /c
struct S {
   __clrcall ~S() {}
};

struct T {
   ~T() {}
};

int main() {
   S s;
   throw s;   // C4382

   S * ps = &s;
   throw ps;   // OK

   T t;
   throw t;   // OK
}