繁体   English   中英

为什么不使用此模板化函数对数组进行零初始化?

[英]Why doesn't this templated function to zero-initialize an array compile?

我正在尝试编写一个简单的模板化函数,该函数会将数组的所有成员初始化为零(如果数组是对象数组,则初始化为默认构造状态)。 这是我写的:

template<typename T, int size> inline void ClearTheArray(T[size] theArray) 
{
   for (size_t i=0; i<size; i++) theArray[i] = T();
}

...这样的想法是我可以将任何数组重置为其默认构造/全零状态,如下所示:

int myArray[6] = {1,2,3,4,5,6};
ClearTheArray(myArray);
// myArray now contains all zeroes

int * somePointer = myArray;
ClearTheArray(somePointer);  // compile error: somePointer doesn't contain array length info

但是,以上代码无法编译; 相反,我在形式参数列表中的theArray的第一个实例中收到语法错误(“ expected')””)。 我在这里做错了什么? 有办法做到这一点吗?

好吧, T[size] theArray根本不是正确的声明语法。 就像在其他任何上下文中声明数组一样,该名称也位于边界之前。 因此, T theArray[size]将是正确的语法。

但这仍然无法实现您想要的操作,因为无法按值传递数组,而尝试按值传递数组会导致数组衰减为指针。 编译器必须将您的参数声明重写为简单的T* theArray 这样就无法推断出size ,并允许您的函数接受任意指针。

要解决这些问题,必须通过引用传递数组

template<typename T, int size> inline void ClearTheArray(T (&theArray)[size]) 
{
   for (size_t i=0; i<size; i++) theArray[i] = T();
}

然后,您的示例用法将按预期运行。

虽然没有重新发明轮子的感觉。 执行此操作的标准方法是

using std::begin;
using std::end;
std::fill(begin(myArray), end(myArray), 0);
std::fill(begin(somePointer), end(somePointer), 0);  // compile error

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM