簡體   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