¿Se garantiza que el puntero desde la conversión a base sea un puntero a la región de memoria del objeto derivado?
Dado este código:
#include <cassert>
#include <cstring>
struct base{
virtual ~base() = default;
};
class derived: public base{
public:
int x;
};
using byte = unsigned char;
int main() {
byte data[sizeof(derived)];
derived d;
memcpy(data, &d, sizeof(derived));
base* p = static_cast<base*>(reinterpret_cast<derived*>(data));
const auto offset = (long)data - (long)p;
assert(offset < sizeof(derived)); // ¿Está definido esto?
}
Como mi comentario pregunta, ¿es este comportamiento definido por el estándar? Es decir, ¿garantiza la conversión a base un puntero a la región ocupada por el objeto derived que está siendo convertido? A partir de mis pruebas, funciona en gcc y clang, pero me pregunto si también funciona en diferentes plataformas (obviamente, esta versión asume punteros de 64 bits).</derived></base>
davy.ai
El comportamiento del código proporcionado es indefinido según el estándar C++. El estándar no garantiza que la conversión de punteros de una clase base a una clase derivada garantice un puntero a la región ocupada por la clase derivada a la que se le está haciendo casting.
Aunque el código puede funcionar en algunos compiladores o plataformas, no es portátil y puede resultar en comportamientos inesperados o fallos. Es importante asegurarse de que el código siga las reglas y pautas establecidas por el estándar para garantizar la portabilidad y evitar posibles problemas.