在C 領域,std::make_pair 函數作為一種方便的函數已經嶄露頭角。用於創建對的工具。然而,當嘗試在 C 11 中使用明確指定的模板參數使用此函數時,會出現一個特殊問題。本文深入研究了這種情況背後的神秘行為。
考慮以下內容嘗試使用明確模板參數建立一對字串和整數的程式碼片段:
std::pair<std::string, int>& b = std::make_pair<std::string, int>(s, 7);
而不是預期的編譯成功,出現神祕錯誤訊息:
error: no matching function for call to 'make_pair(std::string&, int)'
此錯誤的根源在於std::make_pair 的錯誤使用。該函數旨在根據提供的參數推斷模板參數。顯式聲明這些參數會阻礙此推理過程。
std::make_pair 的 C 11 實作採用 T&& 和 U&& 類型的兩個參數,其中 T 和 U 是範本類型參數。當明確指定模板參數時,如有問題的程式碼所示,不會發生參數推導。相反,指定的類型會直接替換到模板聲明中,從而產生以下結果:
make_pair(std::string&& argT, int&& argU);
請注意,明確指定模板中的兩個參數都是右值引用(&&),只能綁定到右值表達式。在提供的程式碼中, s 是一個左值(不是臨時的且未被移動)。因此,函數模板無法匹配參數,從而導致編譯錯誤。
當省略顯式模板參數時,會發生參數推導。由於模板中右值引用參數的特殊性(引用折疊),A&&類型的右值引用參數(其中A是模板類型參數)可以綁定到A的任何類型。無論A是左值、右值、限定或不是,A&& 可以綁定到它。
在範例程式碼中,s 是 std::string 類型的左值,7 是 int 類型的右值。編譯器將 T 推斷為 std::string&,將 U 推斷為 int,從而允許 s 和 7 成功綁定到推斷的參數類型。
要避免此類錯誤,請遵守遵循以下原則:如果可以從函數參數推導出模板參數,則允許編譯器執行推導。明確提供參數通常是不必要的,並且可能會導致意想不到的結果。透過利用參數推導的力量,程式設計師可以簡化程式碼並增強其可讀性,同時保持其正確性。
以上是為什麼 C 11 中的明確模板參數會導致 `std::make_pair` 失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!