Поделиться через


Предупреждение компилятора (ошибка) C4597

неопределенное поведение: offsetof применяется к члену виртуальной базы

Использование offsetof(T, m) , где 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++.