我有一個模板函式,如下所示:
template<typename T>
T foo(byte* &buffer){
...
}
當我嘗試使用固定大小的陣列訪問它時,出現錯誤:
byte buffer[100] = {};
foo<int>(buffer);
但是,當我從緩沖區創建一個新變數并傳遞它時,沒有錯誤:
byte buffer[100] = {};
auto b = buffer;
foo<int>(b);
的型別是buffer什么?不是byte*嗎?有沒有辦法將它轉換為 a byte*?這只發生在模板函式中,否則它會按預期作業。
uj5u.com熱心網友回復:
第一種情況的錯誤是因為陣列buffer 不會衰減,因為您已將其傳遞給參考。也就是說,您不能將指向位元組的指標的參考系結到位元組陣列。
而在第二種情況下b是一個可以通過參考傳遞的指標。
解決方案1
解決這個問題的一種方法是從函式引數中洗掉參考,即通過值的引數。所以按值傳遞看起來像:
template<typename T>
T foo(byte* buffer){//note pass by value
...
}
請注意,在解決方案 1 中,您可以通過指標從函式內部修改陣列。解決方案 1 的一個缺點是,在這里您還可以指向其他指標(例如指向 int 的指標),因此您必須自己注意不要嘗試訪問超出陣列范圍的任何內容。其他替代方法是按照您最初的意圖通過參考傳遞陣列,如解決方案 2 所示。
解決方案2通過參考傳遞陣列
template<typename T, std::size_t N>
T foo(byte (&buffer)[N])//this time you're passing the actual array by reference and not the pointer to its first element
{
}
現在在解決方案 2 中,您已經通過參考傳遞了陣列,您可以直接在函式模板中修改它。現在foo<int>(buffer);將作業。
uj5u.com熱心網友回復:
該問題與模板無關。更改foo為非模板void foo(byte* &buffer),您將看到相同的錯誤。
buffer正如在函式中宣告的那樣,是對指向 的指標的非常量參考byte型別。在您的第二篇文章中,buffer屬于byte[100]左值類別的型別。當分配給 時b,衰減發生并且b屬于byte*左值類別。所以b可以foo無誤地傳遞給。非常量參考可以系結到非常量左值。您的第一篇文章不會以這種方式作業。兩個簡單的修復。
- 更改為
T foo(byte* buffer)。這樣,當傳遞buffer到 時foo,衰減首先發生,導致按值byte*傳遞型別的 r 值(將其視為未命名的臨時中間結果),這沒問題。foo - 更改為
T foo(byte* const buffer)。同樣,衰減首先發生,const 參考可以系結到 r 值,而非常量參考不能。
如果您愿意,也可以將bufferin宣告為foo對 的非常量參考型別byte[100]。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/312586.html
上一篇:js執行后在html中顯示字串
下一篇:第一次使用可變引數函式
