関数ポインタのキャスト

今日はcdecl_thunkをg++に移植したときに詰まった関数ポインタのキャストについて。
cdecl_thunkでは、関数ポインタとオブジェクトポインタ(void*)の相互変換が必要になります。
VC++だと、この変換はreinterpret_castで出来るのですが、規格上は許可されていないため、g++だとコンパイルエラーになります。
reinterpret_castについて規格を参照すると、一見したところ、関数ポインタは別の関数ポインタにしか変換できないように見えます。

ISO/IEC 14882:2003 5.2.10/6
A pointer to a function can be explicitly converted to a pointer to a function of a different type.

しかし、その2つ前の段落には、

ISO/IEC 14882:2003 5.2.10/4
A pointer can be explicitly converted to any integral type large enough to hold it.

という記述もあって、関数ポインタもポインタなので(十分なサイズの)整数型に変換できるようです。
これを利用して、cdecl_thunkでは、

reinterpret_cast<void*>(reinterpret_cast<boost::uint32_t>(func_ptr))

のように一旦整数に変換してからvoidポインタに変換しています。
規格ではこれらの変換における写像関数がほとんど規定されていないので、期待する結果になる保証はないのですが、

[Note: it is intended to be unsurprising to those who know the addressing structure
of the underlying machine. ]

という但し書きがあるのと、そもそもがサンク自体に移植性がないことから、これでいいかなと思っています。少なくともこれでコンパイルエラーにはならないはず、、、。