Q:
在g 4.7 中使用嘗試使用具有明確指定模板參數的std::make_pair 函數編譯程式碼失敗。目標是了解此錯誤的原因。
A:
make_pair 的錯誤用法
std::make_pair用於自動模板參數推導。明確指定模板參數可防止這種推導,從而導致實際參數類型和預期參數類型之間不匹配。函數採用T&& 和U&& 類型的參數,其中T 和U 是模板型參數,實際上類似:
template<typename T, typename U> make_pair(T&& argT, U&& argU);
參數型別差異
指定模板參數時明確地,沒有發生參數推導。相反,在函數模板中直接使用指定的類型,結果是:
make_pair(std::string&& argT, int&& argU);
在這種情況下,兩個參數類型都是右值引用,只能綁定到右值。但是,參數之一 s 是左值(現有物件),這使其與預期的右值參考類型不相容。因此,函數模板無法匹配提供的參數,從而導致編譯錯誤。
make_pair 的正確用法
要解決此問題,請刪除明確模板參數規格並允許自動推論參數。在這種情況下,編譯器可以將 T 推導為 std::string,因為 s 是 std::string 類型的左值,從而導致 std::string& 作為最終參數類型。類似地,U 被推導為 int,參數 7 是 int 類型的右值,結果是 int&&。這些參數類型與函數模板正確匹配,從而可以成功編譯。
模板通用指南
對於模板,通常建議讓編譯器執行模板參數推導只要有可能。僅在絕對必要時才應明確指定模板參數。
以上是為什麼在 C 11 的 `std::make_pair` 中明確指定模板參數無法編譯?的詳細內容。更多資訊請關注PHP中文網其他相關文章!