簡體   English   中英

如何在數組類型的模板代碼中計算std :: size_t

[英]How std::size_t is calculated in the template code for array type

我正在閱讀《 C ++模板 》一書-完整指南,第二版,並從中獲得了如下代碼:

template<typename T>
void showVal(const T &arg1, const T &arg2)
{
    std::cout << arg1 << arg2;
}

int main() {
    showVal("hello", "world1");
    return 0;
}

上面的代碼給了我這個錯誤:- “錯誤C2782:'void showVal(const T&,const T&)':模板參數'T'不明確” 這是合理的,因為我傳遞的參數被推導為const char [6]和const char [7]。 為了解決這個問題,我對函數進行了如下更改:-

template<typename T, std::size_t L1, std::size_t L2>
void showVal(const T (&arg1)[L1], const T(& arg2)[L2])
{
    std::cout << arg1 << arg2;
}

PS:-我從書中獲得了此修復程序

主要的困惑在於L1和L2的值。 編譯器如何知道它必須將6和7傳遞給模板參數L1和L2。 數組類型有任何規則嗎?

如您首次嘗試的錯誤消息所示, "hello"的類型為const char[6] 數組的長度為6。如您所見,數組的長度是數組類型的一部分。 由於編譯器必須知道類型,因此它隱式也知道長度。

就像根據傳遞給非模板參數arg1arg2的表達式的類型(這些類型為const char[6]const char[7] )將模板類型參數T推導出為const char ,模板非類型參數L1L2是從那些相同的參數類型推導出來的。

功能模板

template<typename T, std::size_t L1, std::size_t L2>
void showVal(const T (&arg1)[L1], const T(& arg2)[L2])

調用showVal(“ hello”,“ world1”)編譯器將進行隱式實例化

showVal(const char (&arg1)[6], const T(& arg2)[7])

這樣便可以防止數組衰減到指針,將引用綁定到數組類型,從而實現函數定義已知參數的數組大小。 因此,對於調用showVal(“ hello”,“ world1”),編譯器推斷出T為char,而參數類型分別為char大小為6和7的數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM