2010-04-24 159 views
1

我可以有爲什麼模板聲明中的size_t參數需要爲const?

std::bitset<10> bitsetA; 

const size_t LengthB = 20; 
std::bitset<LengthB> bitsetB; 

沒有任何問題。

但是,如果長度不const

size_t LengthC = 30; 
std::bitset<LengthC> bitsetC; // Line 30, say 

我面臨以下編譯錯誤

'LengthC' cannot appear in a constant-expression 
template argument 1 is invalid 

是什麼原因呢?

如果第30行被接受,那麼編譯器和用戶代碼會出現什麼問題?是不是因爲長度C可能有別名?

+0

另一種方法是Boosts'dynamic_bitset':http://www.boost.org/doc/libs/1_42_0/libs/dynamic_bitset/dynamic_bitset.html – 2010-04-24 16:58:29

回答

4

模板參數必須在編譯時聲明const,以便模板可以在編譯時實例化。

在你給出的例子中,確實看起來LengthC不會從它初始化的地方變成模板必須被實例化的地方,所以它可以被視爲常量,但是編譯器沒有義務弄清楚。規範說明必須聲明參數const,以便不需要編譯時流控制分析。

7

模板根據模板參數實例化新類型,這是在編譯時完成的。您不能在運行時實例化新類型,因爲C++是靜態類型的。

所以當你有一個非const變量時,它不能作爲模板參數傳遞,因爲它不能保證是那個值(你必須潛在地「在運行時實例化一個新類型」時間」)。只有當它是常量時,才能確保該值確實不變,因此可用於模板參數。

1

模板是編譯時生物 - 變量是運行時生物。如果您需要將變量傳遞給模板,則需要在運行時執行該變量,例如在模板類的構造函數中。

1

C++編譯器是嚴格當談到const鑄造。

10const size_t LengthB = 20;都評估爲常數。沒有const關鍵字,編譯器無法輕易確定變量是否可能在聲明和使用之間發生變化。

相關問題