¿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.