我有一个非常简单的POD结构体,包含下面的数组成员。我遇到了初始化固定长度数组成员memberArray
的问题,使用了一个引用固定长度数组参数const uint32_t(&rArrayArg)[22]
。在最终目标环境中,我将无法访问标准库。
成员初始化值memberArray{*rArrayArg}
只会复制rArrayArg
参数的第一个条目。为了看到完整的数组,我需要在构造函数的主体中进行memcpy或者(如本例所示)std::copy。
我还有另一个POD结构体,接受一个二维固定长度数组const uint32_t(&rArrayArg)[4][5]
用于初始化相应的2d成员,则更倾向于成员初始化语法的通用解决方案。
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,
std::copy
也不能使用std::memcpy
?如果是这种情况,你可能需要自己编写代码,或者使用 for 循环进行复制,或者实现你自己的复制方法。 - Cory Kramer