boost::array
(o la versione tr1
o std
) offrono alcune funzionalità aggiuntive su un array integrato.È sempre sicuro sostituire un array integrato con un file std/tr1/boost :: array?
Fino ad ora, la nostra base di codice contiene solo gli array built-in, ad esempio (composto, ma lo stile partite):
WORD m_lastReadFlags[FLAGS_MAX];
...
WORD flagBuffer[FLAGS_MAX];
if (getFlags(flagBuffer)) {
memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags));
...
penso one'll l'idea.
Ora, la mia domanda è, per quei luoghi nel codice, in cui far cadere in boost::array
avrebbe senso (a causa di altre modifiche apportate), è array
un 100% semantica preservare drop-in per il costruito in array? (Possibili errori di compilazione sono OK - cambiamenti di comportamento solo silenziose sono ciò che mi preoccupa.)
Cioè, potrebbe sopra il codice essere riscritta (per esempio) da utilizzare:
boost::array<WORD, FLAGS_MAX> m_lastReadFlags;
e la memcpy (eventualmente adattata per utilizzare c_array()
o data()
) e altri accessi in forma di array rimarrebbero gli stessi? Sì, ovviamente potrei anche sostituire il buffer locale con un array e rimuovere lo memcpy
o usare std::copy
o qualcosa del genere, ma il punto di questa domanda riguarda la compatibilità degli array integrati e della classe dell'array.
Aggiornamento: Una cosa che mi preoccupa è specificamente i luoghi (come nel caso memcpy
), dove gli array built-in vengono utilizzati come puntatori. Tutte le occorrenze verranno catturate dal compilatore /gestite correttamente?
E il compito?
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;
...