Более конкретно, если предположить, что A
является доступным базовым классом B
, делает ли следующий код неопределенное поведение, и является ли утверждение гарантированным, чтобы оно не срабатывало в соответствии со стандартом?
void test(B b1, B b2) {
A* a2 = &b2;
auto offset = reinterpret_cast<char*>(a2) - reinterpret_cast<char*>(&b2);
A* a1 = reinterpret_cast<A*>(reinterpret_cast<char*>(&b1) + offset);
assert(a1 == static_cast<A*>(&b1));
}
Изменить: я знаю, что все распространенные поставщики компиляторов реализуют макет объекта C++ (даже при учете виртуального наследования) таким образом, который совместим с неявными предположениями test
. То, что я ищу, - это гарантия (неявная или явная) для этого поведения в стандарте. В качестве альтернативы также будет принята достаточно подробное описание степени гарантии размещения хранилища объектов, предоставляемой стандартом, в качестве доказательства того, что это поведение не гарантируется.