使用 std::forward 停用範本參數推導
為什麼要使用 std::forward 停用範本參數推導?
std::forward 函數在某些實作中(例如 VS2010)使用名為identity 的模板元函數來禁止模板參數推導。這樣做是為了在涉及左值引用和 const 左值引用的情況下保持對 std::forward 行為的精確控制。
使用模板參數推導的含義
如果std::forward 使用模板參數推導,這會導致根據輸入參數的類型推斷模板參數 (T)。當輸入參數是左值或 const 左值(例如,具有名稱的變數)時,此行為會出現問題。在這種情況下,模板參數推導會錯誤地將 T 推導為左值參考或 const 左值引用,從而導致錯誤的類型轉換。
考慮以下範例:
<code class="cpp">template<typename T> T&& forward_with_deduction(T&& obj) { return static_cast<T&&>(obj); }</code>
傳遞命名變數時或常數到forward_with_deduction,它會錯誤地將它們解釋為左值引用或常數左值引用,從而導致T 被推導。因此,static_cast 操作會將類型折疊為左值引用或 const 左值引用,儘管需要通用引用 (T&&)。
範例:
<code class="cpp">int x; int&& z = std::move(x); // Incorrectly deduces T to be int& and casts z as int& forward_with_deduction(z); // calls test(int&) instead of test(int&&)</code>
std::forward 中的解析
為了確保在所有情況下參數的正確轉換,std::forward 使用了恆等元函數。身分充當佔位類型,阻止編譯器推導模板參數。因此,std::forward 始終將輸入參數解釋為通用引用,無論其實際類型為何。
透過將輸入參數轉換為通用引用,std::forward 可以完美轉送對象,即使它們是左值或 const 左值。此行為可確保轉發參數的類型在整個轉發過程中保持通用參考。
以上是為什麼 `std::forward` 會停用模板參數推導?的詳細內容。更多資訊請關注PHP中文網其他相關文章!