Согласно различным источникам, которые я читал, следующий C++ код вызывает неопределенное поведение:Почему нельзя копировать объекты не-POD с помощью memcpy?
class A {
public:
virtual void method() {
std::cout << "Hello" << std::endl;
}
};
...
A *a, *b;
// obtain 2 Instances from somewhere, then...
memcpy (a, b, sizeof(A));
a->method();
Почему неопределенные эта причина поведения? Я не вижу логической реализации языка, где это не будет вести себя так, как ожидалось (в случае, когда оба объекта имеют одинаковый тип времени выполнения), поэтому почему разработчики языка решили сделать это неопределенным?
Это не может быть * безопасным * в общем случае для этого, но последствия этого должны быть абсолютно познаваемыми, если вы понимаете реализацию рассматриваемого класса. Я по-прежнему не вижу причин, почему неопределенное поведение здесь полезно для разработчиков языков или разработчиков. – Jules
Это не полезно для разработчиков, это UB, чтобы остановить идиотов, стреляющих в ногу. Использование 'memcpy' для копирования инкапсуляции класса. Если автор класса определил конструктор копии или другую нетривиальную специальную функцию-член, то, предположительно, у них есть все основания для этого, а копирование другими средствами может привести к нарушению инвариантов класса.Если класс виртуальный, есть вещи, которые происходят за кулисами, которые компилятор делает для инициализации класса, пользователи не должны создавать объекты, минуя эту инициализацию и создавая объекты frankenstein, которые не были построены. –
Или, говоря иначе, язык говорит: «что вы хотите сделать, разбивает объектную модель C++, которая не поддерживается». –