boost::array
(o la tr1
o std
versión) ofrecen algunas características adicionales agradables sobre una matriz incorporada.¿Es siempre seguro reemplazar una matriz incorporada con una matriz std/tr1/boost ::?
Hasta ahora, nuestra base de código sólo contiene matrices incorporadas, por ejemplo (confeccionadas, pero coincide con el estilo):
WORD m_lastReadFlags[FLAGS_MAX];
...
WORD flagBuffer[FLAGS_MAX];
if (getFlags(flagBuffer)) {
memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags));
...
creo one'll consigue la idea.
Ahora, mi pregunta es, para aquellos lugares en el código, donde cayendo en boost::array
tendría sentido (debido a otros cambios realizados), ¿es array
un 100% semántico preservando el complemento para el conjunto integrado? (Posibles errores de compilación están bien - cambios de comportamiento sólo se silenciosas son lo que me molesta.)
Es decir, podría ser reescrita por encima de código (por ejemplo) a utilizar:
boost::array<WORD, FLAGS_MAX> m_lastReadFlags;
y la memcpy (posiblemente adaptado para usar c_array()
o data()
) y otro acceso similar a un array seguirían siendo los mismos? Sí, por supuesto, también podría reemplazar el búfer local por una matriz y eliminar el memcpy
o utilizar std::copy
o algo así, pero el objetivo de esta pregunta es sobre la compatibilidad de las matrices integradas y la clase de matriz.
Actualización: Una cosa que me molesta es específicamente los lugares (como en el caso memcpy
) donde se utilizan las matrices incorporadas como punteros. ¿Todas las ocurrencias serán detectadas por el compilador /manejado correctamente?
¿Qué pasa con la tarea?
T arr1[N]; // or array<T, N>
T arr2[N]; // or array<T, N>
T* p1;
...
// Note, not all combinations will compile:
arr1 = arr2;
p1 = arr1;
arr2 = p1;
...