boost::array
(или версия tr1
или std
) предлагают несколько приятных дополнительных функций по сравнению со встроенным массивом.
До сих пор наша кодовая база содержала только встроенные массивы, например (составлено, но стиль соответствует):
WORD m_lastReadFlags[FLAGS_MAX];
...
WORD flagBuffer[FLAGS_MAX];
if (getFlags(flagBuffer)) {
memcpy(m_lastReadFlags, flagBuffer, sizeof(m_lastReadFlags));
...
Я думаю, что одна поймет идею.
Теперь, мой вопрос, для тех меств коде, где было бы целесообразно добавить boost::array
(из-за других сделанных изменений), является ли array
семантикой, сохраняющей 100%, для встроенного массива?(Возможные ошибки компилятора в порядке - меня беспокоят только тихие изменения в поведении.)
То есть может вышеуказанный код быть переписан (например) для использования:
boost::array<WORD, FLAGS_MAX> m_lastReadFlags;
, а memcpy (возможно, адаптированный для использования c_array()
или data()
) и другой доступ в виде массива останется прежним? Да, конечно, я мог бы также заменить локальный буфер массивом и удалить memcpy
или использовать std::copy
или что-то в этом роде, но суть этого вопроса заключается в совместимости встроенных массивов икласс массива.
Обновление: одна вещь, которая меня особенно беспокоит, это места (как в случае memcpy
), где встроенные массивы используются в качестве указателей.Будут ли все случаи перехватываться компилятором / обрабатываться правильно?
А как насчет присваивания?
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;
...