¿Por qué el comportamiento de std :: memcpy sería indefinido para objetos que no son TriviallyCopyable?

Dehttp://en.cppreference.com/w/cpp/string/byte/memcpy:

Si los objetos no sonTrivialmente cobrable (por ejemplo, escalares, matrices, estructuras compatibles con C), el comportamiento no está definido.

En mi trabajo, hemos usadostd::memcpy durante mucho tiempo para intercambiar objetos bit a bit que no son TriviallyCopyable usando:

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);
}

y nunca tuve ningún problema.

Entiendo que es trivial abusarstd::memcpy con objetos no trivialmente copiables y provocan un comportamiento indefinido en sentido descendente. Sin embargo, mi pregunta:

¿Por qué el comportamiento destd::memcpy en sí mismo no está definido cuando se usa con objetos no trivialmente copiables? ¿Por qué el estándar considera necesario especificar eso?

ACTUALIZAR

Los contenidos dehttp://en.cppreference.com/w/cpp/string/byte/memcpy se han modificado en respuesta a esta publicación y las respuestas a la publicación. La descripción actual dice:

Si los objetos no sonTrivialmente cobrable (por ejemplo, escalares, matrices, estructuras compatibles con C), el comportamiento no está definido a menos que el programa no dependa de los efectos del destructor del objeto de destino (que no es ejecutado pormemcpy) y la vida útil del objeto de destino (que finaliza, pero no iniciada pormemcpy) se inicia por algún otro medio, como ubicación-nuevo.

PD

Comentario de @Cubbi:

@RSahu si algo garantiza UB en sentido descendente, hace que todo el programa no esté definido. Pero estoy de acuerdo en que parece posible esquivar UB en este caso y modificar la preferencia en consecuencia.

Respuestas a la pregunta(9)

Su respuesta a la pregunta