У меня есть очень простая структура POD, содержащая член массива, показанный ниже. У меня проблемы с инициализацией элемента массива фиксированной длины memberArray
со ссылочным параметром массива фиксированной длины const uint32_t(&rArrayArg)[22]
. У меня не будет доступа к стандартной библиотеке в конечной целевой среде.
Инициализатор члена memberArray{*rArrayArg}
копирует только первую запись из rArrayArg
arg. Чтобы увидеть весь массив, мне нужно использовать memcpy или (как показано здесь) std :: copy в теле конструктора.
У меня есть другая структура POD, которая принимает двумерный массив фиксированной длины const uint32_t(&rArrayArg)[4][5]
, который будет использоваться для инициализации соответствующего 2-го члена, поэтому было бы предпочтительным общее решение для синтаксиса инициализации члена.
struct TestStruct {
explicit TestStruct(
const uint32_t(&rArrayArg)[22])
: memberArray{*rArrayArg}
{
//std::copy(std::cbegin(rArrayArg), std::cend(rArrayArg), memberArray);
}
uint32_t memberArray[22];
// this stream helper is only present for debugging purposes
// in the actual target environment, I will not have access to std::
friend std::ostream& operator<<(std::ostream& os, const TestStruct& rhs) {
os << "TestStruct: ";
for (auto next : rhs.memberArray) {
os << next << ",";
}
return os;
}
};
Следующая демонстрационная версия показывает результат передачи частично заполненного параметра фиксированного массива uint32_t fixedLenArg[22] = {1,2,3,4,5,6};
явному конструктору. Печать результатов показывает:
TestStruct: 1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
так ясно, что копируется только первый параметр. Если я раскомментирую std :: copy в теле конструктора (это отладка, поскольку у меня нет доступа к std :: copy в конечной среде), я получаю следующее:
TestStruct: 1,2,3,4,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,