わかりました、技術的にはこれが未定義の動作であることは知っていますが、それにもかかわらず、私はこれを製品コードで何度も見てきました。間違っている場合は訂正してください。ただし、この「機能」を、現在の C++ 標準に欠けている側面、つまりアドレスを取得できないこと (まあ、メンバー関数の実際のオフセット)。たとえば、これは PCRE (Perl 互換の正規表現) ライブラリの一般的な実装から外れています。
#ifndef offsetof
#define offsetof(p_type,field) ((size_t)&(((p_type *)0)->field))
#endif
このような場合にそのような言語の微妙な点を利用することが有効かどうか、または必要であるかどうかについて議論することができますが、私はそれが次のように使用されていることも見てきました:
struct Result
{
void stat()
{
if(this)
// do something...
else
// do something else...
}
};
// ...somewhere else in the code...
((Result*)0)->stat();
これはうまくいきます!の存在をテストすることでヌル ポインターの逆参照を回避し、ブロックthis
内のクラス メンバーにアクセスしようとしません。else
これらのガードが配置されている限り、それは正当なコードですよね? そのため、疑問が残ります。そのような構造を使用することでメリットが得られる実用的なユースケースはありますか? 最初のケースは言語制限の回避策であるため、2 番目のケースが特に心配です。またはそれは?
PS。C スタイルのキャストについては申し訳ありません。