コンパイラ警告 (エラー) C4597

定義されていない動作: offsetof が仮想ベースのメンバーに適用されています

m が静的なデータ メンバーまたはメンバー関数である offsetof(T, m) を使うと、C4597 が発生します。

解説

この警告は Visual Studio 2017 バージョン 15.3 で新たに追加されたものです。 既定では、エラーとして報告されます。 コンパイラのバージョン別の警告を無効にする方法は、「コンパイラのバージョン別のコンパイラの警告」を参照してください。

次のコードでは、エラー C4597 が発生します。

#include <cstddef>

struct A {
   int ten() { return 10; }
   static constexpr int two = 2;
};

constexpr auto off = offsetof(A, ten);  // C4597: undefined behavior: offsetof applied to member function 'A::ten'
constexpr auto off2 = offsetof(A, two); // C4597: undefined behavior: offsetof applied to static data member 'A::two'

このコードは形式が不適切であり、実行時にクラッシュが発生する可能性があります。 エラーを修正するには、コードを変更します。メンバー関数または静的データ メンバーで offsetof を呼び出さないでください。 これは、C++ 標準で許可されていない移植性のないコードです。