このリンクでは:
http://blogs.msdn.com/b/oldnewthing/archive/2011/04/06/10150261.aspx
最近、次の行が指摘されました。
Widget *pwidOld = reinterpret_cast<Widget*>
(InterlockedCompareExchangePointerRelease(
&reinterpret_cast<PVOID&>(g_pwidCached),
pwid, NULL));
良性の問題と深刻な問題が 1 つずつあります。
良性の 1 つは、戻り値の型で static_cast を実行できることです。
深刻なものは次のようです。
&reinterpret_cast<PVOID&>(g_pwidCached)
厳密なエイリアシングでは、関数に &(void*&)g_pwidCached を渡すと、コンパイラは g_pwidCached の値が変更されていないと見なすことができると言われました。オブジェクトの型ではなく、char* ではありません (g_pwidCached は void* ではないため、Widget* です)。3.10/10 が該当するようです。
これは特定のコンパイラの実装の単なる機能であり、その行が正しく動作することを Visual C++ が保証するだけですか?