Следующий код (или его эквивалент, который использует явные приведения нулевого литерала для избавления от временной переменной) часто используется для вычисления смещения определенной переменной-члена в классе или структуре:
class Class {
public:
int first;
int second;
};
Class* ptr = 0;
size_t offset = reinterpret_cast<char*>(&ptr->second) -
reinterpret_cast<char*>(ptr);
&ptr->second
выглядит следующим образом:
&(ptr->second)
что, в свою очередь, эквивалентно
&((*ptr).second)
который разделяет указатель экземпляра объекта и дает поведение undefined для нулевых указателей.
Итак, это оригинальный штраф или он дает UB?