Из http://en.cppreference.com/w/cpp/string/byte/memcpy:
Если объекты не TriviallyCopyable (например, скаляры, массивы, C-совместимые структуры), поведение undefined.
В моей работе мы долгое время использовали std::memcpy
для побитового обмена объектами, которые не являются TriviallyCopyable, используя:
void swapMemory(Entity* ePtr1, Entity* ePtr2)
{
static const int size = sizeof(Entity);
char swapBuffer[size];
memcpy(swapBuffer, ePtr1, size);
memcpy(ePtr1, ePtr2, size);
memcpy(ePtr2, swapBuffer, size);
}
и никогда не возникало проблем.
Я понимаю, что тривиально злоупотреблять std::memcpy
не-TriviallyCopyable объектами и вызывать поведение undefined по течению. Однако мой вопрос:
Почему поведение std::memcpy
было undefined при использовании с объектами, не связанными с TriviallyCopyable? Почему стандарт считает необходимым указать это?
UPDATE
Содержимое http://en.cppreference.com/w/cpp/string/byte/memcpy было изменено в ответ на этот пост и ответы на сообщение. В текущем описании говорится:
Если объекты не являются TriviallyCopyable (например, скаляры, массивы, C-совместимые структуры), поведение undefined, если только программа не зависит от эффектов деструктора целевого объекта (который не выполняется
memcpy
), а время жизни целевого объекта (которое завершено, но не начато с помощьюmemcpy
) запускается с помощью некоторых других средств, например, размещение-новое.
PS
Комментарий от @Cubbi:
@RSahu, если что-то гарантирует UB downstream, он отображает всю программу undefined. Но я согласен с тем, что в этом случае возможно обойти UB вокруг UB и соответствующим образом изменить cppreference.